前言
C++ 是一門強(qiáng)大而復(fù)雜的編程語言,它有其獨(dú)特的應(yīng)用場(chǎng)景和優(yōu)勢(shì),盡管它可能在學(xué)習(xí)和使用上有一些挑戰(zhàn),但仍然被廣泛采用的原因有很多,盡管 C++ 有其優(yōu)勢(shì),但它也確實(shí)有一些復(fù)雜性和潛在的陷阱,因此在選擇使用它時(shí)需要權(quán)衡。對(duì)于一些應(yīng)用場(chǎng)景,其他編程語言,如Python、Java 或C#,可能更容易上手并且更適合。選擇使用 C++ 還取決于你的具體項(xiàng)目需求、團(tuán)隊(duì)技能和資源可用性。
轉(zhuǎn)眼間已經(jīng)畢業(yè)幾年了,在大學(xué)里一直使用的是Java做的很多項(xiàng)目,參加很多比賽做的項(xiàng)目也是Java+Spring Boot做的后端,談到這里就想到了很多很多回憶.什么IOC,什么Docker,什么Mybtis源碼當(dāng)時(shí)真的賊熟.
在大學(xué)里還做了一個(gè)開源項(xiàng)目:https://github.com/truedei/truedei-swagger-plugin
甚至大四實(shí)習(xí)時(shí)也是使用的Java做后端開發(fā)
為什么我畢業(yè)后卻找了C語言和C++相關(guān)的工作呢?請(qǐng)跟隨腳步,繼續(xù)往下看.
文字有點(diǎn)多,耐心一些,文末送幾本書大家可以看下.
為什么入門選C,不選C++/Java/Python?
踏入大學(xué)的后,計(jì)算機(jī)相關(guān)專業(yè)同學(xué)大多入門的編程課都是C語言,然后慢慢進(jìn)階到C++/Java/Python等高級(jí)語言.為什么會(huì)先學(xué)C,為什么不直接學(xué)習(xí)Java或者C++呢?聽到的很多回答的聲音都是一致認(rèn)為:
-
簡(jiǎn)單性和基礎(chǔ)性:C 語言相對(duì)于許多高級(jí)編程語言來說更加簡(jiǎn)單,語法相對(duì)較少,更容易理解和學(xué)習(xí)。這使得它成為理想的入門語言,有助于建立基本的編程概念和技能,如控制流、數(shù)據(jù)結(jié)構(gòu)、函數(shù)等。
-
底層控制:C 語言提供了對(duì)計(jì)算機(jī)硬件的較低級(jí)別控制,這對(duì)于理解計(jì)算機(jī)體系結(jié)構(gòu)和系統(tǒng)編程非常有幫助。大學(xué)通常希望學(xué)生在深入學(xué)習(xí)更高級(jí)語言之前,能夠建立這種底層理解。
-
跨平臺(tái)性:C 語言是一種較為底層的語言,能夠在各種操作系統(tǒng)和硬件平臺(tái)上編寫程序,這有助于培養(yǎng)學(xué)生編寫可移植代碼的能力。
-
基本算法和數(shù)據(jù)結(jié)構(gòu):學(xué)習(xí) C 語言有助于學(xué)生更深入地理解基本的算法和數(shù)據(jù)結(jié)構(gòu),這些知識(shí)在后續(xù)的編程中非常重要,無論是使用 C++、Java 還是 Python。
一旦學(xué)生掌握了 C 語言的基礎(chǔ)編程概念,他們通常會(huì)更容易地過渡到其他編程語言,因?yàn)樵S多高級(jí)語言如 C++ 和 Java 基于 C 語言,具有類似的語法結(jié)構(gòu)和編程概念。此外,學(xué)習(xí) C 語言可以為學(xué)生提供堅(jiān)實(shí)的編程基礎(chǔ),使他們更容易理解高級(jí)語言中的抽象概念和面向?qū)ο缶幊獭?br> 雖然學(xué)習(xí) C 語言可能需要更多的時(shí)間和精力,但它為學(xué)生提供了深入理解計(jì)算機(jī)編程的堅(jiān)實(shí)基礎(chǔ),這對(duì)于他們未來的職業(yè)發(fā)展非常有幫助。一旦他們掌握了 C 語言,學(xué)習(xí)其他編程語言通常會(huì)相對(duì)容易。因此,大多數(shù)大學(xué)選擇以 C 語言作為計(jì)算機(jī)科學(xué)專業(yè)的入門編程語言是有一定合理性的。
誰在用C++?
C++ 是一門廣泛應(yīng)用的編程語言,許多組織和領(lǐng)域都在使用它。小到嵌入式,大到各種服務(wù)器,到處都可以見到C++的身影. 以下是一些主要領(lǐng)域和用途:
- 游戲開發(fā):C++ 在游戲開發(fā)中非常流行。許多大型游戲引擎,如Unity、Unreal Engine 和 CryEngine,都使用 C++ 編寫。這是因?yàn)?C++ 提供了高性能和直接的硬件控制,對(duì)于需要實(shí)時(shí)圖形渲染和物理模擬的游戲非常重要。
- 系統(tǒng)編程:操作系統(tǒng)、驅(qū)動(dòng)程序和嵌入式系統(tǒng)通常使用 C++ 編寫。C++ 具有底層硬件控制和內(nèi)存管理的能力,使其成為這些領(lǐng)域的首選語言。
- 金融領(lǐng)域:許多金融機(jī)構(gòu)使用 C++ 來構(gòu)建高性能的交易系統(tǒng)和金融應(yīng)用程序。這是因?yàn)?C++ 能夠快速執(zhí)行復(fù)雜的算法和處理大量的數(shù)據(jù)。
- 科學(xué)計(jì)算和數(shù)據(jù)分析:C++ 用于高性能科學(xué)計(jì)算和數(shù)據(jù)分析任務(wù),特別是當(dāng)需要進(jìn)行數(shù)值計(jì)算或處理大型數(shù)據(jù)集時(shí)。例如,一些數(shù)值庫和數(shù)據(jù)處理庫使用 C++ 編寫。
- 嵌入式系統(tǒng):C++ 在嵌入式系統(tǒng)領(lǐng)域非常有用,因?yàn)樗梢葬槍?duì)特定硬件平臺(tái)進(jìn)行優(yōu)化,并提供了對(duì)硬件的低級(jí)別訪問。
- 網(wǎng)絡(luò)和通信:一些網(wǎng)絡(luò)和通信應(yīng)用程序使用 C++ 編寫,以實(shí)現(xiàn)高性能的數(shù)據(jù)傳輸和協(xié)議處理。
- 圖形設(shè)計(jì)和計(jì)算機(jī)圖形學(xué):C++ 用于創(chuàng)建圖形設(shè)計(jì)工具、3D建模軟件以及圖形渲染應(yīng)用程序。一些開源圖形庫,如OpenGL和DirectX,也是用C++編寫的。
- 大規(guī)模應(yīng)用程序:一些大規(guī)模的應(yīng)用程序,如數(shù)據(jù)庫管理系統(tǒng)和操作系統(tǒng)核心,也使用C++編寫,因?yàn)樗峁┝烁叨鹊目煽匦院托阅堋?/li>
C++ 是一門多用途的編程語言,由于其性能、控制力和跨平臺(tái)能力,被廣泛應(yīng)用于各種不同的領(lǐng)域和行業(yè)。雖然它有一些復(fù)雜性,但在需要高性能和底層控制的應(yīng)用中,仍然是一個(gè)強(qiáng)大的選擇。
我的經(jīng)歷
為什么我畢業(yè)后卻找了C語言和C++相關(guān)的工作呢?現(xiàn)在就揭曉答案.
原因是:就在即將畢業(yè)的前夕,還有2-3周就要離校了. 其實(shí)我已經(jīng)找好工作了,北京,上海,深圳都拿到了面試的Offer.深圳拿到了20多K也是很不錯(cuò)的,年薪30W+,公司挺不錯(cuò)的,也很大但是沒去,有點(diǎn)不喜歡這家公司的文化,加班比較嚴(yán)重,離家也非常遠(yuǎn),萬一家里有點(diǎn)啥事回趟家都費(fèi)勁.從深圳回個(gè)家就小1000沒了,來回2000沒了…想想就不能接受.
北京也很不錯(cuò),Offer有游戲開發(fā)的崗位,也有傳統(tǒng)軟件的崗位等,北京真的不太想去了,因?yàn)榇笏脑诒本V聯(lián)達(dá)總部實(shí)習(xí)了一年,北京給我的感覺就是堵,走到哪都是排隊(duì),排隊(duì),再排隊(duì).
各種原因就選擇了上海,就在選擇了上海的Offer之后.突然招聘軟件有位好老板聯(lián)系到了我,問我想不想試試他們的這個(gè)崗位. 當(dāng)時(shí)我已經(jīng)跟上海的另一家公司談好了,公司也有幾百人.我就各種推辭,不太想嘗試,有一點(diǎn)是因?yàn)楣颈容^小,覺得可能也沒這么可靠吧.而且我之前面試都是Java,這家公司需要C或C++知識(shí)體系的人.而且是屬于Linux下的C/C++軟件開發(fā)…
我對(duì)Linux情有獨(dú)鐘,因?yàn)槲覐母咭痪徒佑|到了Linux,高中還參加Linux比賽,拿到了全國的金牌獎(jiǎng)項(xiàng),一直到大學(xué)一直在無間斷的使用Linux.
其實(shí)沒看到這家公司招聘之前,我一直不想去找Linux相關(guān)的工作,第一是因?yàn)楦杏X運(yùn)維太簡(jiǎn)單了,不想接觸.第二是難的崗位太難了,而且自己從來沒接觸過.
后來經(jīng)過交談, 這家公司真的給我眼前一亮,好老板說我沒接觸過這個(gè)相關(guān)的也沒關(guān)系,也原因給我時(shí)間工作后去學(xué)習(xí),而且薪資也可以按照已經(jīng)找到的工作的薪資付給我.(有點(diǎn)心動(dòng)了)就答應(yīng)了可以參加面試.
后來公司的技術(shù)負(fù)責(zé)人和好老板一塊參與了交談和面試, 經(jīng)過交談,給我的感覺是這個(gè)技術(shù)負(fù)責(zé)人和我大四實(shí)習(xí)是的師傅一樣,人還不錯(cuò),實(shí)習(xí)時(shí)找的工作就是因?yàn)槊嬖嚨母杏X比較好,交談的比較舒服才決定去這家公司的.而且你不理解的東西,能給你講的透透的…這妥妥的是一位大佬,有大佬帶誰不心動(dòng)…最后答應(yīng)就去了這家公司.
就這樣,從Java轉(zhuǎn)到C/C++就靠了一個(gè)緣分.真的很感謝好老板給的機(jī)會(huì).我是真的喜歡Linux.就想挑戰(zhàn)有難度的工作.
就這樣,到了現(xiàn)在,一直在做Linux嵌入式應(yīng)用程序,音視頻相關(guān)的工作,也接觸一些Linux內(nèi)核,驅(qū)動(dòng)相關(guān)的工作.都是C/C++.
C++是真難,用到了快放棄.
我認(rèn)為難點(diǎn)在于(站在嵌入式的領(lǐng)域來說):
- 1.調(diào)試麻煩,做嵌入式的工作,我認(rèn)為唯一有效率且通用的調(diào)試方式就是printf();(那么想快速的調(diào)試代碼,找到BUG,就需要學(xué)習(xí)GDB等調(diào)試工具了)
- 2.開發(fā)工具都不是這么智能,你使用的開發(fā)工具可能永遠(yuǎn)提示不出來xxx.xxx.后面的代碼補(bǔ)全提示,不像在開發(fā)Java的時(shí)候有IDEA神器;(那么想使用好C/C++就需要看個(gè)人基礎(chǔ)了)
- 3.如果沒有硬件的知識(shí),一旦和硬件的技術(shù)打交道就會(huì)比較吃力.(無其他辦法,除了學(xué)習(xí)還是得繼續(xù)學(xué)習(xí))
- 4.需要比較強(qiáng)的理論知識(shí);
- 5.編程語言的規(guī)范.(非常重要,非常重要,非常重要,非常重要)
基礎(chǔ)問題,大有學(xué)問
下面是我之前記錄的一些問題,學(xué)習(xí)記錄而來,還未來得及發(fā)博客.正好可以體現(xiàn)出來C++規(guī)范.將從以下幾個(gè)方面來闡述在C與語言開發(fā)中所遇到的問題,以及如何使用C++來解決,以及相應(yīng)的解決方案;
1、C語言字符語法的常見陷阱及如何用C++來解決
例如,定義了如下4個(gè)變量
char c1 = 'yes';
char c2 = "yes";
const char* s1 = "/";
const char* s2 = '/';
可以以你的經(jīng)驗(yàn)來選擇哪個(gè)對(duì),哪個(gè)錯(cuò);
答案是:
c1和s1對(duì),c2和s2錯(cuò);
這里需要注意的是char和char*,雙" "引號(hào)和單’ '號(hào)的區(qū)別:
char存放單個(gè)字符;
char*存放一串字符;
雙引號(hào)" "存放一個(gè)字符串;
但引號(hào)’ '存放一個(gè)字符;
所以:
我們用char來存放一個(gè)字符串是錯(cuò)的
char c2 = "yes";
所以:
用char*存放一個(gè)字符是錯(cuò)的
const char* s2 = '/';
你是不是在想:把c2=“yes”,改成c2=“y”,雙引號(hào)""中只存放單個(gè)字符是不是就可以了呢?
char c2 = "yes";
#改成
char c2 = "y";
答案是不可以的;
例如:
char c2 = "y"; // “y” 雙引號(hào)其實(shí)是由\0結(jié)尾的,所以真正的存儲(chǔ)方式是: {'y','\0'}
有些同志可能對(duì)c1有點(diǎn)疑惑,單引號(hào)’'不是來存儲(chǔ)單個(gè)字符的嗎?為什么c1=‘yes’,寫了3個(gè)字符也沒問題呢?
這是因?yàn)镃語言編譯器有截?cái)鄼C(jī)制;
char c1 = 'yes';//會(huì)被截?cái)?,結(jié)果可能有2種:1.保留首字符,2.保留尾字符
cout << c1 << endl;
如果把c1打印出來,我電腦中的結(jié)果是s;
不同的編譯器可能結(jié)果是不同的。
ubuntu x86的電腦上:
(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ g++ main.cpp
main.cpp:15:15: warning: multi-character character constant [-Wmultichar]
15 | char c1 = 'yes';
| ^~~~~
main.cpp: In function ‘int main()’:
main.cpp:15:15: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘7955827’ to ‘'s'’ [-Woverflow]
(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$
arm交叉編譯工具:
(base) zhenghui@zh-pc:~/tftpboot$ arm-linux-gnueabihf-sigmastar-9.1.0-g++ test.cpp -o test
test.cpp:5:15: 警告: 多字節(jié)字符常量 [-Wmultichar]
5 | char c1 = 'yes';
| ^~~~~
test.cpp: 在函數(shù)‘int main()’中:
test.cpp:5:15: 警告: unsigned conversion from ‘int’ to ‘char’ changes value from ‘7955827’ to ‘'s'’ [-Woverflow]
(base) zhenghui@zh-pc:~/tftpboot$
可以看到提示的警告信息,會(huì)自動(dòng)轉(zhuǎn)換成s;
又換了一種arm交叉編譯工具:
(base) zhenghui@zh-pc:~/tftpboot$ arm-linux-gnueabihf-g++ test.cpp -o test
test.cpp:5:15: 警告: 多字節(jié)字符常量 [-Wmultichar]
char c1 = 'yes';
^~~~~
test.cpp: 在函數(shù)‘int main()’中:
test.cpp:5:15: 警告: large integer implicitly truncated to unsigned type [-Woverflow]
(base) zhenghui@zh-pc:~/tftpboot$
依然會(huì)被截?cái)啵Y(jié)果還是s;
又換了一個(gè),結(jié)果還是一樣:
zh@xxx:project$ arm-none-linux-gnueabi-g++ test.cpp -o testa
test.cpp:5:15: warning: multi-character character constant
test.cpp: In function 'int main()':
test.cpp:5: warning: large integer implicitly truncated to unsigned type
zh@xxx:project$
對(duì)于s1和s2也是:因?yàn)閏har*接收的是一個(gè)字符串,但是s2傳遞的是一個(gè)單引號(hào)’'的值,所以s2會(huì)報(bào)錯(cuò)。
const char* s1 = "/";
const char* s2 = '/';
但是char*可以引用char:
char c1 = 'yes'; //s
// char c2 = "yes";
cout << c1 << endl;
const char* s1 = "/";
// const char* s2 = '/';
const char* s2 = &c1; //s
cout << *s2 << endl;
C語言是高級(jí)語言中的低級(jí)語言。
優(yōu)點(diǎn)是:小巧,高效,接近地層;
缺點(diǎn)是:細(xì)節(jié)和陷阱比較多。
使用C++來解決和規(guī)避以上問題
C++定義了string類,專門用來存儲(chǔ)和提供了一系列的字符串操作。
#include "string"
using namespace std;
string str1(1,'yes');
cout << str1 << endl; // s
string str2(2,'yes');
cout << str2 << endl; // ss
string str3("yes");
cout << str3 << endl; // yes
例如下面這個(gè),傳入了1,‘yes’,打印出來就取了1個(gè)s
string str1(1,'yes');
cout << str1 << endl; // s
傳遞2的時(shí)候,就打印了2個(gè)ss
string str2(2,'yes');
cout << str2 << endl; // ss
就可以規(guī)避上面的問題,用C++操作字符串也比較安心。
2、C語言數(shù)組常見問題及如何用C++來解決
我們?cè)贑語言項(xiàng)目開發(fā)中,經(jīng)常遇到函數(shù)之前傳遞數(shù)組的情況,也帶來了一些問題。
例如我們有如下一個(gè)數(shù)組:
int array1[] = {1,2,3,4,5,6,7,8,9,10};
我們求平均值:
double result;
for (int i = 0; i < 10; ++i) {
result += array1[i];
}
result = result / 10;
cout << result << endl; //5.5
如果我們想再填入一些數(shù)呢?
int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
估計(jì)自己數(shù)都數(shù)暈了吧。
在C語言中可以使用sizeof()函數(shù)計(jì)算一個(gè)數(shù)組的長(zhǎng)度。
例如我們可以改成這樣:
int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
int len = sizeof(array1) / sizeof(array1[0]);
double result;
for (int i = 0; i < len; ++i) {
result += array1[i];
}
result = result / len;
cout << result << endl;
有了自動(dòng)計(jì)算數(shù)組中元素個(gè)數(shù)的代碼,我們就不用再手動(dòng)計(jì)算了。
但是我們把計(jì)算平均值的代碼提出為一個(gè)獨(dú)立函數(shù)時(shí)該怎么做呢?
可以寫一個(gè)函數(shù),把數(shù)組傳遞過去,然后返回平均值
double avg1(int array[]) {
int len = sizeof(array) / sizeof(array[0]);
double result;
for (int i = 0; i < len; ++i) {
result += array[i];
}
result = result / len;
return result;
}
int main() {
int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
int len = sizeof(array1) / sizeof(array1[0]);
cout << avg1(array1) << endl;
return 0;
}
運(yùn)行結(jié)果:
真是現(xiàn)實(shí)比較骨感阿。
1.5
算出來的值是不對(duì)的。
為什么造成這個(gè)結(jié)果呢?
我們?cè)?個(gè)函數(shù)中打印以下len的長(zhǎng)度看看:
double avg1(int array[]) {
int len = sizeof(array) / sizeof(array[0]);
cout << "avg1 len->" << len << endl; //2
double result;
for (int i = 0; i < len; ++i) {
result += array[i];
}
result = result / len;
return result;
}
int main() {
int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
int len = sizeof(array1) / sizeof(array1[0]);
cout << "main len->" << len << endl; //24
cout << avg1(array1) << endl;
return 0;
}
運(yùn)行結(jié)果:
main len->24
avg1 len->2
1.5
為什么傳遞過去的數(shù)組沒能計(jì)算出來結(jié)果呢?
因?yàn)椋?/p>
在C語言中傳遞數(shù)組時(shí),編譯器會(huì)把數(shù)組[]轉(zhuǎn)換成指針的方式傳遞過去;所以sizeof計(jì)算出來的結(jié)果并不是正確的。
編譯的時(shí)候,也會(huì)warning:
(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ g++ main.cpp
main.cpp: In function ‘double avg1(int*)’:
main.cpp:8:22: warning: ‘sizeof’ on array function parameter ‘a(chǎn)rray’ will return size of ‘int*’ [-Wsizeof-array-argument]
8 | int len = sizeof(array) / sizeof(array[0]);
| ~^~~~~~
main.cpp:7:17: note: declared here
7 | double avg1(int array[]) {
| ~~~~^~~~~~~
(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$
copy一份avg1改寫avg2:
這次改寫成指針的方式來接收一個(gè)數(shù)組,看看計(jì)算的結(jié)果是不是一樣
double avg2(int *array) {
int len = sizeof(array) / sizeof(array[0]);
cout << "avg2 len->" << len << endl; //2
double result;
for (int i = 0; i < len; ++i) {
result += array[i];
}
result = result / len;
return result;
}
int main() {
int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
int len = sizeof(array1) / sizeof(array1[0]);
cout << "main len->" << len << endl; //24
cout << "avg1:"<< avg1(array1) << endl;
cout << "avg2:"<< avg2(array1) << endl;
return 0;
}
運(yùn)行結(jié)果:
avg2(int *array) 和 avg1(int array[]) 運(yùn)行的結(jié)果是一樣的,說明數(shù)組確實(shí)是被轉(zhuǎn)成指針了
main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5
值得一提的是,我們手動(dòng)g++編譯的時(shí)候,avg2并沒有報(bào)出warning信息,說明我們用指針的方式來接收一個(gè)數(shù)組的語法是正確的,編譯器是認(rèn)可的。
C語言中如何解決數(shù)組傳遞計(jì)算的值的多少不對(duì)的問題呢?
答案是在傳遞數(shù)組的時(shí)候把數(shù)組中的元素個(gè)數(shù)提前計(jì)算好,一起傳遞過去。
我們利用avg2改寫avg3:
double avg3(int *array, int len) {
cout << "avg3 len->" << len << endl; //2
double result;
for (int i = 0; i < len; ++i) {
result += array[i];
}
result = result / len;
return result;
}
int main() {
int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
int len = sizeof(array1) / sizeof(array1[0]);
cout << "main len->" << len << endl; //24
cout << "avg1:"<< avg1(array1) << endl; //1.5
cout << "avg2:"<< avg2(array1) << endl; //1.5
cout << "avg3:"<< avg3(array1, len) << endl; //107.292
return 0;
}
再次運(yùn)行結(jié)果:
可以看到正確了。
main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5
avg3:avg3 len->24
107.292
用C++解決上述問題
在C++中提供了vector對(duì)象,需要include一下:
#include "vector"
copy avg3改寫avg4:
double avg4(vector<int> v) {
cout << "avg4 len->" << v.size() << endl;
double result;
for (int i = 0; i < v.size(); ++i) {
result += v[i];
}
result = result / v.size();
return result;
}
vector數(shù)組的初始化如下:
int main() {
int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
int len = sizeof(array1) / sizeof(array1[0]);
cout << "main len->" << len << endl; //24
cout << "avg1:"<< avg1(array1) << endl; //1.5
cout << "avg2:"<< avg2(array1) << endl; //1.5
cout << "avg3:"<< avg3(array1, len) << endl; //107.292
vector<int> v{1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
cout << "avg4:"<< avg4(v) << endl; //107.292
return 0;
}
運(yùn)行結(jié)果:
main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5
avg3:avg3 len->24
107.292
avg4:avg4 len->24
107.292
比較高效的傳遞方式是采用引用的方式傳遞過來:
這樣傳遞參數(shù)是比較高效的。
double avg4(vector<int> &v){
...
}
還可以改成迭代器的方式:
double avg5(vector<int> &v) {
cout << "avg4 len->" << v.size() << endl;
double result;
vector<int>::iterator itr = v.begin();
for (; itr != v.end(); ++itr) {
result += (*itr);
}
result = result / v.size();
return result;
}
使用vector寫二維數(shù)組:
double avg6(vector<vector<int>> &vv) {
double result;
int data_num = 0;
for (int i = 0; i < vv.size(); ++i) {
for (int j = 0; j < vv[i].size(); ++j) {
result += vv[i][j];
data_num++;
}
}
result = result / data_num;
return result;
}
int main() {
vector<vector<int>> vv{{1,2,3},{1,2,3},{1,2,3}};
cout << "avg6:"<< avg6(vv) << endl;
return 0;
}
C++編程規(guī)范為什么這么重要?
提到C開發(fā)的一些規(guī)范, 有些C/C開發(fā)者可能想到了很多手冊(cè)什么的,就不一一列舉了,我比較喜歡的是 《C++ Core Guidelines 》這個(gè)開源項(xiàng)目
地址在: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
該開源項(xiàng)目是英文的,對(duì)國內(nèi)的開發(fā)者來說不是太友好.但是如果英語好,很值得一看.
自從得知國內(nèi)的C++大佬們,把國外的書籍翻譯過來了,《C++ Core Guidelines解析 》中文書籍已經(jīng)上市了,立馬買了看了看.
書中講解讓我受益匪淺,隨便放幾個(gè)照片:
書籍入口: 點(diǎn)我進(jìn)入書籍入口
點(diǎn)不進(jìn)去,再復(fù)制到瀏覽器也可以:
https://union-click.jd.com/jdc?e=&p=JF8BAPsJK1olXwQEU19VCk4WBF8IHloTVAcEXW4ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYHVVhUCU0eHDZNRwYlD3NKUEQ0bxh0dD9LUC0RFlx8IV0ETkcbM2oIGlsUVQ4KUF1tC0oVAWgPG1kWVDYyVF9tWiXPtdnQvuoJiayNgdbKOEonA2gAGV8QWAQBUlhfDXsXC2s4Rh9JBVkBUm5tOEgnM18IK1glA2gDB1hfCRhAAgFVR1oQB1JUATBdAEMSBWwMGFwlXwcDVlxtOHtCUxNUUCZwBwZ9BB5UVAJveBtIQyx2NXtsVgYDdA5kSwtDGy9hCFZrMioNOA
巧了,我這有三本可以送給大家,大家可以先加我QQ群,然后加我微信,進(jìn)去微信點(diǎn)贊,送給微信點(diǎn)贊的第18名,68名和128名每人一本《C++ Core Guidelines解析 》中文書籍 .文章來源:http://www.zghlxwxcb.cn/news/detail-701900.html
個(gè)人微信就不方便放了,可以先加群.再加我私人微信.文章來源地址http://www.zghlxwxcb.cn/news/detail-701900.html
到了這里,關(guān)于C++這么難,為什么我們還要用C++?C++ Core Guidelines解析給了我答案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!