Linux(3)——基礎開發工具

目錄

一、軟件包管理器——yum

1.Linux下安裝程序的方式

2.什么是yum

3.查找軟件包

4.安裝軟件

5.本地與服務器端進行文件互傳

6.卸載軟件?

二、Linux的編輯器——vim?

1.基本概念

2.vim下各個模式之間的切換

3.vim在命令行模式下的命令匯總

4.vim在底行模式下的命令匯總

5.關于vim的配置

三、Linux中的編譯器——gcc和g++

1.gcc和g++的作用

2.gcc和g++的語法

3.預處理

4.編譯

5.匯編

6.鏈接

7.動靜態庫

四、Linux中的調試器——gdb

1.背景知識

2.gdb命令的匯總

五、Linux——自動化構建工具

1.背景知識

2.依賴關系和依賴方法

3.多文件編譯

4.如何編寫makefile

5.項目清理


一、軟件包管理器——yum

1.Linux下安裝程序的方式

在Linux環境下安裝軟件的方式有以下幾個方式:

1)源碼安裝,直接下載源代碼,讓它自行編譯運行形成可執行程序。

2)軟件包安裝,下載rpm安裝包,通過rpm包獲取資源安裝。

3)包管理器安裝,通過yum安裝(推薦),ubuntu(apt)這個方式類似于我們手機上的應用商店。(這個方式可以解決包的依賴問題)

2.什么是yum

定義:

YUM(Yellowdog Updater, Modified)?是基于 RPM(Red Hat Package Manager)的軟件包管理工具,主要用于?Red Hat 系列 Linux 系統(如 RHEL、CentOS、Fedora 等),用于自動化安裝、更新、卸載軟件包,以及管理軟件包之間的依賴關系,一次性解決安裝的問題。

敲黑板:一個云服務器在同一時間只允許一個yum進行安裝,不能在同一時刻安裝多個軟件。

溫馨提示:在通過yum進行安裝時,我們首先要保證服務器或虛擬機是處在聯網狀態的,可以通過下面這個命令來驗證是否聯網,如果沒有打印任何信息則沒有連上網,需要檢查網絡配置。

3.查找軟件包

我們可以通過以下命令來查看可以下載的軟件:

yum list


注意事項:

1)軟件包名稱:主版本號.次版本號.源程序發行號-軟件包的發行號.主機平臺.cpu架構。
2)"x86_64"后綴表示64位系統的安裝包,"i686"后綴表示32位系統安裝包,選擇包時要和系統匹配。
3)"el7"表示操作系統發行版的版本,“el7"表示的是"centos7/redhat7”,“el6"表示"centos6/redhat6”。
4)最后一列表示的是“軟件源”的名稱,類似于“小米應用商店”,“華為應用商店”這樣的概念。

這里拿lrzsz做一個說明:

先解釋一下這個軟件包是什么:lrzsz可以將Windows當中的文件上傳到Linux當中,也可以將Linux當中的文件下載到Windows當中,實現云服務器和本地機器之間進行信息互傳。

yum list | grep lrzsz

4.安裝軟件

指令:sudo yum install? 軟件名

例如:我們要安裝的lrzsz

# Centos$ sudo yum install -y lrzsz# Ubuntu$ sudo apt install -y lrzsz

敲黑板:

1)由于安裝軟件是在系統目錄下,所以我們需要使用sudo或者直接是用root賬戶去安裝

2)yum安裝軟件只能裝完這一個再去裝下一個,不然會報錯的。

5.本地與服務器端進行文件互傳

我們安裝好了lrzsz,那么我們就可以進行本地和服務器之間進行互傳。

指令:rz

通過這個命令可以實現本地向服務器傳文件。

指令:sz

通過這個指令可以實現從服務向本地導文件。

6.卸載軟件?

指令:sudo yum remove 軟件名

# Centos
sudo yum remove [-y] lrzsz# Ubuntu
sudo apt remove [-y] lrzsz

通過這個命令可以卸載軟件,中途需要按下"y"來確認。

二、Linux的編輯器——vim?

1.基本概念

我們這里介紹最常用的幾種模式,分別是命令模式、插?模式和底?模式,各模式的功能區分如下:

1)正常/普通/命令模式(Normal mode)?

控制屏幕光標的移動,字符、字或?的刪除,移動復制某區段及進?Insert mode下,或者到 last line mode

2)插入模式(Insert mode)

只有在Insert mode下,才可以做?字輸?,按「ESC」鍵可回到命令?模式。該模式是我們后面用的最頻繁的編輯模式。

3)末行模式(Last line mode)

?件保存或退出,也可以進??件替換,找字符串,列出行號等操作。 在命令模式下,*shift+:*即可進?該模式。要查看你的所有模式:打開vim,底?模式直接輸? :help vim-modes

2.vim下各個模式之間的切換

指令:vim 文件名

vim test.c

我們在進入vim后,默認是在命令行模式,需要敲擊(i/a/o)進入插入模式。

【命令模式】切換至【插入模式】
1)輸入「i」:在當前光標處進入插入模式。
2)輸入「a」:在當前光標的后一位置進入插入模式。
3)輸入「o」:在當前光標處新起一行進入插入模式。


【命令模式】切換至【底行模式】
1)輸入[Shift+;」 即可,實際上就是輸入「:」


【插入模式】或【底行模式】切換至【命令模式)
1)插入模式或是底行模式切換至命令模式都是直接按一下「Esc」鍵即可。

3.vim在命令行模式下的命令匯總

移動光標:

vim可以直接用鍵盤上的光標來上下左右移動,但正規的vim是用小寫英文字母「h」、「j」「k」、「I」,分別控制光標左、下、上、右移一格


1)按「G」:移動到文章的最后
2)按「$」:移動到光標所在行的“行尾
3)按「^」:移動到光標所在行的“行首
4)按「w」:光標跳到下個字的開頭
5)按「e」:光標跳到下個字的字尾
6)按「b」:光標回到上個字的開頭
7)按「#」:光標移到該行的第#個位置,如:5l,56l
8)按[gg]:進入到文本開始
9)按[shift+g]:進入文本末端
10)按「ctrl」+「b」:屏幕往“后”移動一頁
11)按「ctrl」+「f」:屏幕往“前”移動一頁
12)按「ctrl」+「u」:屏幕往“后”移動半頁
13)按「ctrl」+「d」:屏幕往“前”移動半頁

刪除文字:

1)「x」:每按一次,刪除光標所在位置的一個字符
2)「#x」:例如,「6x」表示刪除光標所在位置的“后面(包含自己在內)”6個字符
3)「X」:大寫的X,每按一次,刪除光標所在位置的“前面”一個字符
4)「#X」:例如,「20X」表示刪除光標所在位置的“前面”20個字符
5)「dd」:刪除光標所在行
6)「#dd」:從光標所在行開始刪除#行

復制:

1)「yW」:將光標所在之處到字尾的字符復制到緩沖區中。
2)「#yW」:復制#個字到緩沖區
3)「yy」:復制光標所在行到緩沖區。
4)「#yy」: 例如,「6yy」表示拷貝從光標所在的該行“往下數”6行文字。
6)「p」:將緩沖區內的字符貼到光標所在位置。注意:所有與“y”有關的復制命令都必須與“p”配合才能完成復制與粘貼功能。

替換:

1)「r」:替換光標所在處的字符。
2)「R」:替換光標所到之處的字符,直到按下「ESC」鍵為止。

撤銷上一次操作:

1)「u」:如果您誤執行一個命令,可以馬上按下「u」,回到上一個操作。按多次“u”可以執行多次回復。
2)「ctrl+r」:撤銷的恢復

更改:

1)「cw」:更改光標所在處的字到字尾處
2)「c#w」:例如,「c3w」表示更改3個字

跳至指定行:

1)「ctrl」+「g」列出光標所在行的行號。
2)「#G」:例如,「15G」,表示移動光標至文章的第15行行首。

4.vim在底行模式下的命令匯總

這里跳至底行的方法是,一直Esc(避免你不知道是在哪一個模式下),再按【:】進入底行模式。

行號設置:

1)「set nu」:輸入后,會在文件中的每一行前面列出行號。

2)「set nonu」:取消行號。

跳至某一行:

「#」:「#」號表示一個數字,在冒號后輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字
15,再回車,就會跳到文章的第15行。

查找字符:

1)「/關鍵字」:先按「/」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按「n」會往后尋找到您要的關鍵字為止。
2)「?關鍵字」:先按「?」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可
以一直按「n」會往前尋找到您要的關鍵字為止。

保存文件:

[w」:在冒號輸入字母「w」就可以將文件保存起來

離開vim:

1)「q」:按「q」就是退出,如果無法離開vim,可以在「q」后跟一個「!」強制離開vim。
2)「wq」:一般建議離開時,搭配「w」一起使用,這樣在退出的時候還可以保存文件。

5.關于vim的配置

vim的配置是一人一份的,一個用戶配置的是自己的并不影響別人。每個人雖然用的是同一個vim程序,但是大家用的是vim不同的配置(每個用戶在自己的家目錄下都有屬于自己的配置文件)
我們需要創建.vimrc文件,并在自己的.vimrc文件中添加一系列的命令,充當于vim的配置文件。所謂的vim的基本配置,就是修改自己的vimrc!

如果是自己配置的話比較麻煩,所以這里提供一個碼云上面的自動一鍵配置vim的命令。

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

配置完成之后:

但是要注意的是,這個的默認縮進是兩個空格,我們可以打開.vimrc來配置。?

三、Linux中的編譯器——gcc和g++

1.gcc和g++的作用

gcc和g++分別是c和c++的編譯器,它們在執行編譯時,有如下幾個步驟:
1)預處理(進行宏替換/去注釋/條件編譯/頭文件展開等)
2)編譯(生成匯編)
3)匯編(生成機器可識別代碼)
4)連接(生成可執行文件或庫文件)

2.gcc和g++的語法

格式:gcc/g++ 選項 文件

選項功能描述
-c僅編譯不鏈接,生成目標文件 (.o)
-S生成匯編代碼文件 (.s)
-E僅進行預處理,不編譯
-o <file>指定輸出文件名為<file>
-g生成調試信息,用于 GDB 調試
-O0不進行優化(默認)
-O1基本優化
-O2更高級優化(推薦)
-O3最高級優化(可能增加編譯時間)
-Os優化代碼大小

3.預處理

作用:頭文件展開,去注釋,宏替換,條件編譯

指令:

gcc -E hello.c -o hello.i 

說明:

選項“-E”,該選項的作用是讓 gcc 在預處理結束后停止編譯過程。
選項“-o””是指目標文件,“.i”文件為已經過預處理的C原始程序。

4.編譯

作用:

在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。

?指令:

gcc -S hello.i -o hello.s 

說明:

用戶可以使用-S選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
-o選項是指目標文件,“xxx.s”文件為已經過翻譯的原始程序。

5.匯編

作用:將匯編代碼轉變為二進制碼。

指令:

gcc -c hello.s -o hello.o

說明:

匯編階段是把編譯階段生成的“xxx.s”文件轉成目標文件。
使用-c選項就可以得到匯編代碼轉化為“xxx.o”的二進制目標代碼了。

6.鏈接

作用:鏈接就是將生成的各個“xxx.o”文件進行鏈接,生成可執行文件。

指令:

gcc hello.o -o hello 

說明:

gcc/g++不帶-E、-S、-c選項時,就默認生成預處理、編譯、匯編、鏈接全過程后的文件。
若不用-o選項指定生成文件的文件名,則默認生成的可執行文件名為a.out。

敲黑板:鏈接產生的文件也是二進制的。

7.動靜態庫

函數庫可以分成動態庫和靜態庫:

1)靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名一般為“.a”
2)動態庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由
運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫一般后綴名為“.so”

有動靜態庫,那么就有了動靜態鏈接:

動態鏈接:

優點:節省空間,易于更新,靈活性高。

缺點:依賴外部環境,加載時間長,不同程序可能依賴同一庫的不同版本,可能會引發版本沖突問題。

靜態鏈接:

優點:獨立性強,加載速度快,便于我們調試。

缺點:占用空間大,更新維護困難,資源浪費。

我們是用gcc和g++鏈接時默認是動態鏈接的,可以通過file指令查看:

我們還可以通過ldd來查看所依賴的庫。

敲黑板:?

Linux下,動態庫XXX.so,靜態庫XXX.a
Windows下,動態庫XXX.dll,靜態庫XXX.lib

那么我們如何實現靜態鏈接呢?

這里我們在編譯時只需要帶上-static的選項即可。

我們還可以查看一下兩種鏈接方式的文件大小的區別:

很明顯,靜態鏈接方式的文件更大,說明了動態鏈接節省空間。

四、Linux中的調試器——gdb

1.背景知識

程序的發布模式有兩種,分別是debug模式和release模式,而調試只能在debug模式下。

Linux 的gcc和g++編譯出來的二進制程序,默認是release模式,所以默認是不支持調試的。

如果是想實現調試則需要在生成二進制程序時,加上-g選項。

我們也可以對比一下在relesase和debug模式下兩個可執行程序的大小。

我們發現在debug模式下還是要比release模式下的可執行程序的大一些。

2.gdb命令的匯總

基本上都是用過即可。

進出gdb:

進入:gdb 二進制文件
退出:ctrl+d或quit 調試命令

調試:

1)run/r:運行代碼(啟動調試)
2)next/n:逐過程調試。
3)step/s:逐語句調試。
4)until 行號:跳轉至指定行。
5)finish:執行完當前正在調用的函數后停下來(不能是主函數)
6)continue/c:運行到下一個斷點處。
7)set var 變量=x:修改變量的值為x。

顯示:
1)list/l n:顯示從第n行開始的源代碼,每次顯示10行,若n未給出則默認從上次的位置往下顯示。
2)list 函數名:顯示該函數的源代碼。
3)print/p 變量:打印變量的值。
4)print/p &變量:打印變量的地址。
5)print/p 表達式:打印表達式的值,通過表達式可以修改變量的值。
6)display 變量:將變量加入常顯示(每次停下來都顯示它的值)。
7)display &變量:將變量的地址加入常顯示。
8)undisplay 編號:取消指定編號變量的常顯示。
9)bt:查看各級函數調用及參數。
10)info/i locals:查看當前棧幀當中局部變量的值。

斷點:

1)break/b n:在第n行設置斷點。
2)break/b 函數名:不在某函數體內第一行設置斷點。
3)info breakpoint/b:查看已打斷點信息。
4)delete/d 編號:刪除指定編號的斷點。
5)disable 編號:禁用指定編號的斷點。
6)enable 編號:啟用指定編號的斷點。

五、Linux——自動化構建工具

1.背景知識

1)會不會寫makefile,從一個側面說明了一個人是否具備完成大型工程的能力。
2)一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作
3)makefile帶來的好處就是--“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
4)make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,VisualC++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。
5)make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構建。

2.依賴關系和依賴方法

我們在寫makefile一定要首先理解各個文件之間的依賴的關系以及它們之間的依賴方法。

依賴關系:文件A的變化會影響到文件B,那么我們就稱文件B依賴于文件A。

比如:文件hello.o是由文件hello.c文件通過預處理、編譯以及匯編產生的,所以hello.c的改變會影響到hello.o,也就是hello.o依賴hello.c。

依賴方法:如果文件B依賴于文件A,那么通過文件A得到文件B的方法,就是文件B依賴于文件A的依賴方法。

比如:hello.o依賴于hello.c,而hello.c通過gcc -c hello.c -o test.o指令就可以得到test.o,那么hello.o依賴于hello.c的依賴方法就是gcc -c hello.c -o test.o。

3.多文件編譯

如果我們有很多個源文件需要編譯,應該怎么辦呢?

這里我們可以使用常用的方法,直接使用gcc。

我們講行多文件編譯的時候一般不使源文件直接生成可執行程序,而是先用每個源文件各自生成自己的二講制文件,然后重將這些一進制文件通過鏈接生成可執行程序。

那么我們為什么要這么做呢?

因為如果我們修改了其中的一個源文件,那么我們再生成可執行是就需要重新再把所有的源文件進行編譯鏈接。而如果是把各個源文件生成各個二進制文件,那么修改后只需要把修改的文件重新編譯生成二進制文件,然后在把二進制文件鏈接。

但是隨著源文件的數量增加,我們如果還是以之前的方式就會極其的惡心,這個時候我們就需要用到make和makefile來大大減少工作量。

4.如何編寫makefile

第一步:源文件所在目錄下創建了一個makefile/Makefile文件

第二步:編寫makefile文件

保存并退出后,make執行后便可以得到我們想要的文件。

makefile中的技巧寫法:

符號含義
$@當前規則的目標文件名。
$<第一個依賴文件的名稱。
$^所有依賴文件的列表,以空格分隔(去重)。

上面代碼的簡寫:

make的工作原理:

1)make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。
2)如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到 myproc 這個文件,并把這個文件作為最終的目標文件。
3)如果 myproc 文件不存在,或是 myproc 所依賴的后面的 myproc.o 文件的文件修改時間要比 myproc 這個文件新(可以用 touch 測試),那么,他就會執行后面所定義的命令來生成myproc 這個文件。
4)如果 myproc 所依賴的 myproc.o 文件不存在,那么 make 會在當前文件中找目標為myproc.o 文件的依賴性,如果找到則再根據那一個規則生成 myproc.o文件。(這有點像一個堆棧的過程)
5)當然,你的C文件和H文件是存在的啦,于是make會生成 myproc.o 文件,然后再用myproc.o 文件聲明 make 的終極任務,也就是執行文件 hello 了。
6)這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。
7)在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。
8)make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦。

5.項目清理

在執行完后,有可能我們需要刪除之前的執行的結果文件再執行新的文件,那么我們應該如何實現和執行相似的過程呢?

這樣寫好之后我們只要make clean就可執行之前寫的代碼。

敲黑板:

一般將這種clean的目標文件設置為偽目標,用.PHONY修飾,偽目標的特性是:總是被執行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82423.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82423.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據學習(121)-sql重點問題

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

【QT】QString和QStringList去掉空格的方法總結

目錄 一、QString去掉空格 1. 移除字符串首尾的空格&#xff08;trimmed&#xff09; 2. 移除字符串中的所有空格&#xff08;remove&#xff09; 3. 僅移除左側&#xff08;開頭&#xff09;或右側&#xff08;結尾&#xff09;空格 4. 替換多個連續空格為單個空格 5. 移…

電腦 IP 地址修改工具,輕松實現異地登陸

在互聯網時代&#xff0c;異地登陸需求日益頻繁 —— 訪問區域限制內容、跨區協作、優化游戲體驗等場景&#xff0c;都需要通過修改 IP 地址實現。 一、IP 地址基礎認知 IP 地址是設備的網絡身份標識&#xff0c;不同地區分配不同 IP 段。通過修改 IP&#xff0c;可模擬目標地…

[BUG]Debian/Linux操作系統中 安裝 curl等軟件顯示無候選安裝(E: 軟件包 curl 沒有可安裝候選)

本文內容組織形式 問題描述失效原因解決方案首先修改源列表為國內確認當前系統的版本Debian 11 (Bullseye)Debian 12 (Bookworm) 執行系統升級更新系統重新安裝curl 結語 問題描述 日期&#xff1a;20250526 操作系統&#xff1a; debian darkchunkdebian:/home$ sudo apt i…

leetcode hot100刷題日記——12.反轉鏈表

解答&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(n…

JavaSE核心知識點04工具04-01(JDK21)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 JavaSE核心知識點04工具04-01&#xff08;JD…

數據庫入門:以商品訂單系統為例

數據庫入門&#xff1a;以商品訂單系統為例 一、前言 數據庫是現代軟件開發中不可或缺的基礎&#xff0c;掌握數據庫的基本概念和操作&#xff0c;是每個開發者的必經之路。本文將以“商品-品牌-客戶-訂單-訂單項”為例&#xff0c;帶你快速入門數據庫的核心知識和基本操作。…

UE失落方舟特效學習 筆記01

通過法線扭曲貼圖 Begin Object Class/Script/UnrealEd.MaterialGraphNode Name"MaterialGraphNode_0" ExportPath"/Script/UnrealEd.MaterialGraphNode/Engine/Transient.M_RadialUV_01:MaterialGraph_0.MaterialGraphNode_0"Begin Object Class/Script/E…

跨境支付風控失效?用代理 IP 構建「地域 - 設備 - 行為」三維防護網

針對跨境支付風控失效問題&#xff0c;結合代理IP技術構建「地域-設備-行為」三維防護網是當前最有效的解決方案。以下是基于最新實踐的技術路徑與策略指南&#xff1a; 一、地域維度&#xff1a;IP地理特征精準匹配 IP屬地真實性驗證 優先選擇住宅代理IP&#xff08;Residenti…

AI的“軟肋”:架構設計與業務分析的壁壘

盡管人工智能&#xff08;AI&#xff09;在代碼生成、數據分析等方面取得了顯著進展&#xff0c;但在架構設計和業務分析的核心領域&#xff0c;人類的智慧和經驗仍然是不可替代的。這些領域往往涉及高度的抽象思維、戰略遠見、對復雜商業邏輯的深刻理解以及在模糊不清的環境中…

【Redis實戰篇】基于Redis的功能實現附近商鋪查詢(Geo),用戶簽到與統計(Bitmap),網站UV統計(HyperLogLog)

文章目錄 附近商鋪GEOSEARCH 實現語法參數解釋 GEORADIUS 實現基本語法參數詳解必選參數可選參數參數詳解必選參數 代碼實現 用戶簽到BitmapRedis 中 Bitmap 基本操作1. 設置位值2. 獲取位值3. 統計位值為 1 的數量4. 位圖運算 Spring Data Redis 中操作 Bitmap1. 操作示例(1) …

【C++高階一】二叉搜索樹

【C高階一】二叉搜索樹剖析 1.什么是二叉搜索樹2.二叉搜索樹非遞歸實現2.1插入2.2刪除2.2.1刪除分析一2.2.2刪除分析二 2.3查找 3.二叉搜索樹遞歸實現3.1插入3.2刪除3.3查找 4.完整代碼 1.什么是二叉搜索樹 任何一個節點&#xff0c;他的左子樹的所有節點都比他小&#xff0c;右…

前端面試熱門知識點總結

URL從輸入到頁面展示的過程 版本1 1.用戶在瀏覽器的地址欄輸入訪問的URL地址。瀏覽器會先根據這個URL查看瀏覽器緩存-系統緩存-路由器緩存&#xff0c;若緩存中有&#xff0c;直接跳到第6步操作&#xff0c;若沒有&#xff0c;則按照下面的步驟進行操作。 2.瀏覽器根據輸入的UR…

Swagger | 解決Springboot2.x/3.x不兼容和依賴報錯等問題

目錄 不兼容報錯提醒 1. 修改Spring Boot版本 2. 修改application.yml配置文件 3. 使用其他替代方案 依賴兼容 配置 Yaml 文件 依賴報錯提醒 解決方法 1. 選擇一個庫 2. 移除springfox依賴 3. 添加springdoc依賴 4. 配置springdoc 5. 清理項目 6. 啟動項目 示例代…

C++默認構造函數、普通構造函數、拷貝構造、移動構造、委托構造及析構函數深度解析

目錄 一、默認構造函數&#xff08;Default Constructor&#xff09;二、普通構造函數&#xff08;General Constructor&#xff09;三、拷貝構造函數&#xff08;Copy Constructor&#xff09;四、移動構造函數&#xff08;Move Constructor&#xff0c;C11&#xff09;五、委…

JVM 深度解析

一、JVM 概述 1.1 什么是 JVM&#xff1f; JVM&#xff08;Java Virtual Machine&#xff0c;Java 虛擬機&#xff09;是 Java 程序運行的核心引擎。它像一個“翻譯官”&#xff0c;將 Java 字節碼轉換為機器能理解的指令&#xff0c;并管理程序運行時的內存、線程等資源。 …

OpenCV CUDA 模塊圖像過濾-----創建一個計算圖像導數的濾波器函數createDerivFilter()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::createDerivFilter 是 OpenCV CUDA 模塊中的一個工廠函數&#xff0c;用于創建一個計算圖像導數的濾波器。這個濾波器可以用來計算圖像…

Spring Boot 接口開發實戰指南

Spring Boot 接口開發實戰指南 一、基礎接口開發步驟 1.1 添加必要依賴 <!-- pom.xml --> <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></depen…

題目 3325: 藍橋杯2025年第十六屆省賽真題-2025 圖形

題目 3325: 藍橋杯2025年第十六屆省賽真題-2025 圖形 時間限制: 2s 內存限制: 192MB 提交: 494 解決: 206 題目描述 小藍要畫一個 2025 圖形。圖形的形狀為一個 h w 的矩形&#xff0c;其中 h 表示圖形的高&#xff0c;w 表示圖形的寬。當 h 5,w 10 時&#xff0c;圖形如下所…

UML 時序圖 使用案例

UML 時序圖 UML 時序圖 (Sequence Diagram)時序圖的主要元素消息類型詳解時序圖示例時序圖繪制步驟時序圖的應用場景 UML 時序圖 (Sequence Diagram) 時序圖是UML(統一建模語言)中用于展示對象之間交互行為的動態視圖&#xff0c;它特別強調消息的時間順序。 時序圖的主要元素…