※ 本文為 MindOcean 轉寄自 ptt.cc 更新時間: 2020-10-11 10:26:04
看板 Gossiping
作者 標題 Re: [問卦] C十十 適合新手嗎?
時間 Sat Oct 10 19:15:13 2020
C++有兩個分水嶺
一個是在C++11以前的
另一個是C++11以後的
稱為Modern C++
這篇我就focus on Modern C++
大概就是C++11 C++14 C++17 C++20
Modern C++會強調
* Smart Pointer
自動回收空間
能避免dangling reference造成程式crash
* Perfect Forwarding / R-value reference
首先
先去了解什麼是 r-value/l-value
再去了解r-value-reference/l-value-reference
然後完美轉發就是基於 R-value reference
如果有人問你
"C++比C快在哪裡"
你可以回它因為有著Perfect forwarding的機制在
* std:thread
concurrency的表準化
裡面除了mutex外
還有效率更高的atom
兩者有各自適合的地方
* constexpr關鍵字
可以讓編譯器在編譯時期優化的一個新cv-qualified
* auto/decltype 型別推斷
C++11開始引入
現在C++17已經算是很完整了
如果型別是編譯時期就知道的
請使用auto關鍵字
給定一段程式
template<typename It> // algorithm to dwim ("do what I mean")
void dwim(It b, It e) // for all elements in range from
{
//想自動取的It<T> 裡面的型別T作為初始化宣告
T val = ...
}
你有想過我要如何自動得到並初始化
It<T>裡面的型別T嗎
這要要用到trait-class
template<typename It> // algorithm to dwim ("do what I mean")
void dwim(It b, It e) // for all elements in range from
{ // b to e
while (b != e) {
typename std::iterator_traits<It>::value_type
currValue = *b;
…
}
}
三小 這麼簡地的事情也要弄到那麼複雜的trait-class
C++11自從有了auto之後,
這件事情不再痛苦
template<typename It> // as before
void dwim(It b, It e)
{
while (b != e) {
auto currValue = *b;
…
}
* 請使用 using A = TYPE 取代 typedef
trait-calss是個有點複雜的東西
請愛用using + auto 取代這個
比方說
std::remove_const<T>::type 可以寫成
std::remove_const_t<T> ,
而std::remove_const_t<T> 的實作即
template <class T>
using remove_const_t = typename remove_const<T>::type;
推薦書籍:
Effective Modern C++
但建議先看過:
Effective C++
結論: 歡迎跳槽到rust ^_^
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.124.76 (臺灣)
※ 文章代碼(AID): #1VWPV43N (Gossiping)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1602328516.A.0D7.html
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:15:32
內文應該超過87%都是中文吧?
有句話這麼說
不會TMP(template-meta-programming)
還是回去C語言拔
不在乎效能的話隔壁的python也不錯
現在還有go rust可以玩
我提到的都有中文版喔
只是C++本身這語言就不好入門
但很多確實是正面的
看看C++17的 std::filesystem
我覺得std函式庫最神的就是這個
說真的 我會建議新首先去玩python再來是C
python都不行我只能說沒有天份
世界上還有很多事情可以做
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:23:37
這些都是查的到的喔
中文書都出來了
應該不算太先進吧XD
我剛入門rust的時候
大家對lifetime/borrow很疑惑的時候
我心想
這不就是C++的r-value-reference和完美轉發嗎XD
然後很快就理解了
多學真的有好處~
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:25:12
我只是半業餘菜逼八@@
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:27:24
C++14 還能把lambda的引數宣告為auto 更猛XD
effective C++有些觀念會過時
看modern effective C++就知道
所以建議同時看兩本
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:28:59
primer比較像字典
effectiveC++比較是單元式主題探討
目前有人拿它克制Linux kernel
然後實做os出來
應該是沒問題了
雖然firmware式C語言
功能還很陽春
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:30:43
Jserv的你所不知道的C語言雖然深了一點
但它的課程建議至少看懂六成再來C++
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:31:34
C++11之後終於可以不用再typedef了
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:47:42
因為入門C++的書
我覺得要像effective比較有實用性
如果直接讀primer(字典)
會不知道你學的諸如constexpr, auto
要用在哪裡
但primer是一本好字典
我也有買一本原文版XD
https://i.imgur.com/gE1tdHS.png
plus版本好像又不一樣喔
plus好像沒有說得像prime那麼深入..
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:03:09
所以需要知道你的auto推出來的是什麼版本
這邊提供一個檢查技巧(effective modern c++這本書有)
//先創建一個測試的class TD
template<typename T> // declaration only for TD;
class TD; // TD == "Type Displayer"
//以auto宣告型別並初始化
auto t = "some string";
//使用TD
TD<decltype(t)> tType;
//這時候你通常會看到類似的編譯錯誤訊息
error: aggregate 'TD<char*> tType' has incomplete type and
cannot be defined
那個 'TD<char*> tType'裡面的char*就是你用auto推出來的型別
回到你的問題
看這例子
std::vector<bool> features(const Widget& w);
Widget w;
…
auto highPriority = features(w)[5]; // is w high priority?
…
processWidget(w, highPriority); // process w in accord
// with its priority
你猜highPriority會被推成什麼型別? 理想的bool?
不對 它被推成
std::vector<bool>::reference 這個型別
這關係到std::vector<bool>裡面的實作方式
這時候只能避開auto了
但可以用上面的方式先檢查推導出來的型別
現在5e版本好一點了
我看原文覺得不會太難
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:20:07
如果加上 -std=c++03 那可能就不代表什麼
但是modern-c++確實是突破性的發展
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:22:01
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:24:25
C語言開始就比較需要對電腦的了解了
舉個題目
1)請把CPU周邊的配置畫出來
2)承上,我從鍵盤打入A,到螢幕顯示A,試問經過哪些CPU周邊?
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 21:32:42
--
→ : 新手看完第一段決定放棄1F 10/10 19:17
→ : 還好吧!一樓也太容易放棄了?文組嗎?2F 10/10 19:18
推 : XD3F 10/10 19:18
推 : 講中文謝謝4F 10/10 19:18
內文應該超過87%都是中文吧?
推 : 新手看到標題就放棄了5F 10/10 19:19
推 : 新手你給他template...6F 10/10 19:19
有句話這麼說
不會TMP(template-meta-programming)
還是回去C語言拔
不在乎效能的話隔壁的python也不錯
現在還有go rust可以玩
推 : 書有中文版嗎?沒有推什麼推。7F 10/10 19:19
我提到的都有中文版喔
只是C++本身這語言就不好入門
→ : c++很有野心想解決一堆問題 搞到現在又肥又大8F 10/10 19:20
但很多確實是正面的
看看C++17的 std::filesystem
我覺得std函式庫最神的就是這個
推 : 新手不是應該先寫個hello world?9F 10/10 19:20
說真的 我會建議新首先去玩python再來是C
python都不行我只能說沒有天份
世界上還有很多事情可以做
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:23:37
推 : 結論笑死10F 10/10 19:21
→ : 說中文好嗎11F 10/10 19:22
推 : 不要話說一說就莫名開始推坑好嗎12F 10/10 19:22
這些都是查的到的喔
中文書都出來了
應該不算太先進吧XD
推 : 學了總是有好處吧13F 10/10 19:22
我剛入門rust的時候
大家對lifetime/borrow很疑惑的時候
我心想
這不就是C++的r-value-reference和完美轉發嗎XD
然後很快就理解了
多學真的有好處~
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:25:12
推 : 大神出沒14F 10/10 19:26
我只是半業餘菜逼八@@
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:27:24
推 : C++11之後還能宣告local lambda function,真他X方便15F 10/10 19:27
C++14 還能把lambda的引數宣告為auto 更猛XD
推 : 學C++直接從effective C++開始看嗎?還是之前還要入門本?16F 10/10 19:27
effective C++有些觀念會過時
看modern effective C++就知道
所以建議同時看兩本
推 : 總之c++不是一個適合拿來入門的語言17F 10/10 19:27
YES!※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:28:59
→ : 入門我推java18F 10/10 19:28
→ : 沒看過effectiveC++,跟c++primer那本有什麼不一樣嗎19F 10/10 19:28
primer比較像字典
effectiveC++比較是單元式主題探討
推 : rust成熟了嗎?20F 10/10 19:28
目前有人拿它克制Linux kernel
然後實做os出來
應該是沒問題了
雖然firmware式C語言
功能還很陽春
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:30:43
→ : python入門的 看過太多之後碰其它語言連個型別都不會分21F 10/10 19:30
Jserv的你所不知道的C語言雖然深了一點
但它的課程建議至少看懂六成再來C++
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:31:34
推 : 入門我建議用QB22F 10/10 19:43
推 : typedef難用23F 10/10 19:46
C++11之後終於可以不用再typedef了
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:47:42
→ : effective是指教你寫出effective的code;還是effectively24F 10/10 19:48
→ : 入門本啊?
→ : 入門本啊?
因為入門C++的書
我覺得要像effective比較有實用性
如果直接讀primer(字典)
會不知道你學的諸如constexpr, auto
要用在哪裡
但primer是一本好字典
我也有買一本原文版XD
https://i.imgur.com/gE1tdHS.png
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:52:00
→ : 好久沒看了荒廢有點久qq27F 10/10 20:00
plus版本好像又不一樣喔
plus好像沒有說得像prime那麼深入..
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:03:09
推 : 要死了啊,當年 win 出現,逼退一狗票 dos 下自己學的工28F 10/10 20:05
→ : 程師;現在這出現是要逼退我了,以後只剩張嘴了..
→ : 程師;現在這出現是要逼退我了,以後只剩張嘴了..
推 : auto有時候還是不太行,不能當主力用,之前eigen有遇過30F 10/10 20:07
→ : 個問題就是用auto初始化會造成copy錯誤
→ : 個問題就是用auto初始化會造成copy錯誤
所以需要知道你的auto推出來的是什麼版本
這邊提供一個檢查技巧(effective modern c++這本書有)
//先創建一個測試的class TD
template<typename T> // declaration only for TD;
class TD; // TD == "Type Displayer"
//以auto宣告型別並初始化
auto t = "some string";
//使用TD
TD<decltype(t)> tType;
//這時候你通常會看到類似的編譯錯誤訊息
error: aggregate 'TD<char*> tType' has incomplete type and
cannot be defined
那個 'TD<char*> tType'裡面的char*就是你用auto推出來的型別
回到你的問題
看這例子
std::vector<bool> features(const Widget& w);
Widget w;
…
auto highPriority = features(w)[5]; // is w high priority?
…
processWidget(w, highPriority); // process w in accord
// with its priority
你猜highPriority會被推成什麼型別? 理想的bool?
不對 它被推成
std::vector<bool>::reference 這個型別
這關係到std::vector<bool>裡面的實作方式
這時候只能避開auto了
但可以用上面的方式先檢查推導出來的型別
推 : 姆咪,我之前都不知道有兩個版本,剛上網查了一下好像plu32F 10/10 20:08
→ : s版比較淺沒錯
但是沒有plus版有點像在看天書..→ : s版比較淺沒錯
現在5e版本好一點了
我看原文覺得不會太難
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:20:07
→ : compiler比較新不代表什麼34F 10/10 20:12
如果加上 -std=c++03 那可能就不代表什麼
但是modern-c++確實是突破性的發展
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:22:01
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:24:25
推 : 什麼是 鐵鏽?35F 10/10 20:25
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:25:45推 : 新手還是玩python 吧 這篇第一段看完直接放棄36F 10/10 21:01
推 : 新手先從python了解程式的樂趣邏輯,之後再碰c也不錯37F 10/10 21:17
→ : 好文推
→ : 好文推
C語言開始就比較需要對電腦的了解了
舉個題目
1)請把CPU周邊的配置畫出來
2)承上,我從鍵盤打入A,到螢幕顯示A,試問經過哪些CPU周邊?
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 21:32:42
推 : 跪著看 謝謝無私分享39F 10/10 22:43
推 : 竟然大部分看得懂 好港動...謝謝我的OOP老師40F 10/10 22:57
推 : 推推推41F 10/11 00:09
→ : 三小42F 10/11 00:37
推 : 推= =43F 10/11 00:50
--
※ 看板: Gossiping 文章推薦值: 0 目前人氣: 0 累積人氣: 367
回列表(←)
分享