從零開始一起學習SLAM | C++新特性要不要學?
LAM,C++程式設計是必備技能。不過,大家在學校裡學習的書本一般比較老,主要還是C++98那些老一套。
本文所謂的C++新特性是指C++11及其以後的C++14、C++17增加的新關鍵字和新語法特性。其中C++11是C++98以來最重要的一次變化,而其後的C++14、C++17是在該基礎上的完善和補充。
那麼,問題來了,如果我不想學習新特性,還是像以前那樣程式設計可以嗎?
答案是:可以,不過這就像是別人已經在用鐵製刀具切瓜了,你還在石器時代使用石頭刀具,你說,效率能一樣嗎?
看看下面你心裡就有答案了。
為何要學習新特性?
1、可以大幅度提高程式設計效率,切瓜更6
C++新特性增加了很多非常高效的關鍵字和語法,比如std::swap,C++11之前的swap執行了三次記憶體拷貝操作,這種不必要的記憶體操作會影響效率。而C++11之後的swap引入了右值引用和資料移動的概念,使用記憶體移管代替了不必要的記憶體拷貝,大大提高了效率。
2、省心省力,減少脫髮
舉個栗子。C++11之前如果我們要定義並初始化一個新變數,必須得知道其型別並定義,這在很多時候是非常繁瑣的,比如迭代器的使用,而C++11之後引入了自動型別推導,一個auto解決一切,不需要關心型別,編譯器會幫你自動推匯出型別。
3、能看懂別人的程式碼,不被新時代拋棄
由於上述的優點,很多開原始碼都是使用C++新特性,工作學習中大家也都使用新特性,如果你根本不瞭解這些新特性,估計很難看懂別人的程式碼,時代的戰車會轟隆隆把你拋棄。
下面就列舉幾個比較典型的、經常使用的新特性,供大家入門。
常用的C++新特性
1、更方便的列表初始化
C++11前只有陣列能使用初始化列表。而C++11後大部分型別都可以初始化列表,方便的很。如下所示。
2、省心省力的自動型別推導
C++11中引入了auto,可以用來進行自動型別推導,不用關心資料型別,編譯器會幫你推導好,而且這種方式也不影響編譯速度。
比如迭代器使用了自動型別推導後,感覺清爽多了,如下圖所示:
不過,auto使用時也有需要注意的地方:
比如auto不能代表一個實際的型別宣告,auto宣告的變數必須馬上初始化
見下圖:
更多內容可以網上查詢,如果懶得找可以參考:
ofollow,noindex">https://blog.csdn.net/m_buddy/article/details/72828576
3、簡潔舒服的迴圈體
for迴圈是使用頻率非常高的迴圈方式,在新特性裡我們不需要再像以前那樣每次都使用自增或者自減的方式來索引了,結合前面介紹的auto,我們可以極大簡化迴圈方式,如下圖所示:
而且這種迴圈支援大部分資料型別,比如陣列,容器,字串,迭代器等等。
4、簡潔的lambda表示式
lambda表示式可以使得程式設計非常簡潔,尤其適用於簡單的函式,一般形式如下:
[函式物件引數](操作符過載函式引數)->返回值型別{函式體}
下面是幾個例子及解釋:
5、隨心所欲可變長的引數模板
在Python和MATLAB中可以非常方便的使用可以變長的引數,C++11以後引入了tuple,可以實現類似功能,並且可以傳入多個不同型別的資料,如下圖所示
6、其他新特性自己學吧
除了上述介紹的常用的幾種新特性外,還有很多新特性,比如:
decltype:像auto的反函式,可以從一個變數或表示式中得到型別;
nullptr:解決原來C++中NULL的二義性問題;
STL容器、智慧指標、多執行緒相關的新特性
可以在網上查到很多資料,如果懶得找,可以看看下面兩個連結。
https://www.cnblogs.com/feng-sc/p/5710724.html
http://towriting.com/blog/2013/08/01/what-is-cpp11/
文末知識星球裡也有相關的電子書和視訊講解。
練習題
請使用C++新特性改寫以下函式。該函式功能:將一組無序的座標按照“Z”字形排序,並輸出。
本程式學習目標:
熟悉C++新特性(簡化迴圈、自動型別推導、列表初始化、lambda函式)
題目:
正確輸出結果:
如果想要下載以上程式碼框架,在公眾號選單欄回覆:11,即可。
歡迎留言討論,更多學習視訊、文件資料、參考答案等掃描下方二維碼進入知識星球「從零開始學習SLAM」和其他學習SLAM學的夥伴一起學習交流~
原文連結: 從零開始一起學習SLAM | C++新特性要不要學?
---------------------
作者:electech6
來源:CSDN
原文:https://blog.csdn.net/electech6/article/details/82891655
版權宣告:本文為博主原創文章,轉載請附上博文連結!