顯示廣告
隱藏 ✕
※ 本文為 MindOcean 轉寄自 ptt.cc 更新時間: 2020-10-11 10:26:04
看板 Gossiping
作者 dzwei (Args&&... args)
標題 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
riker729: 新手看完第一段決定放棄1F 10/10 19:17
qsxwdc: 還好吧!一樓也太容易放棄了?文組嗎?2F 10/10 19:18
cuteSquirrel: XD3F 10/10 19:18
Nigger5566: 講中文謝謝4F 10/10 19:18

內文應該超過87%都是中文吧?

Ericz7000: 新手看到標題就放棄了5F 10/10 19:19
kindaichitom: 新手你給他template...6F 10/10 19:19

有句話這麼說
不會TMP(template-meta-programming)
還是回去C語言拔
不在乎效能的話隔壁的python也不錯
現在還有go rust可以玩

ggirls: 書有中文版嗎?沒有推什麼推。7F 10/10 19:19

我提到的都有中文版喔
只是C++本身這語言就不好入門

ekgs: c++很有野心想解決一堆問題 搞到現在又肥又大8F 10/10 19:20

但很多確實是正面的
看看C++17的 std::filesystem
我覺得std函式庫最神的就是這個

riker729: 新手不是應該先寫個hello world?9F 10/10 19:20

說真的 我會建議新首先去玩python再來是C
python都不行我只能說沒有天份
世界上還有很多事情可以做
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:23:37
longlyeagle: 結論笑死10F 10/10 19:21
snow3804: 說中文好嗎11F 10/10 19:22
DarkIllusion: 不要話說一說就莫名開始推坑好嗎12F 10/10 19:22

這些都是查的到的喔
中文書都出來了
應該不算太先進吧XD

neofire: 學了總是有好處吧13F 10/10 19:22

我剛入門rust的時候
大家對lifetime/borrow很疑惑的時候
我心想
這不就是C++的r-value-reference和完美轉發嗎XD
然後很快就理解了
多學真的有好處~
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:25:12
CorkiN: 大神出沒14F 10/10 19:26

我只是半業餘菜逼八@@
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:27:24
jasonlou: C++11之後還能宣告local lambda function,真他X方便15F 10/10 19:27

C++14 還能把lambda的引數宣告為auto 更猛XD

ggirls: 學C++直接從effective C++開始看嗎?還是之前還要入門本?16F 10/10 19:27

effective C++有些觀念會過時
看modern effective C++就知道
所以建議同時看兩本

ekgs: 總之c++不是一個適合拿來入門的語言17F 10/10 19:27
YES!
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:28:59
ekgs: 入門我推java18F 10/10 19:28
CorkiN: 沒看過effectiveC++,跟c++primer那本有什麼不一樣嗎19F 10/10 19:28

primer比較像字典
effectiveC++比較是單元式主題探討

justty32: rust成熟了嗎?20F 10/10 19:28

目前有人拿它克制Linux kernel

然後實做os出來

應該是沒問題了

雖然firmware式C語言

功能還很陽春
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:30:43
ekgs: python入門的 看過太多之後碰其它語言連個型別都不會分21F 10/10 19:30

Jserv的你所不知道的C語言雖然深了一點
但它的課程建議至少看懂六成再來C++
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:31:34
kindaichitom: 入門我建議用QB22F 10/10 19:43
velaro: typedef難用23F 10/10 19:46

C++11之後終於可以不用再typedef了
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:47:42
ggirls: effective是指教你寫出effective的code;還是effectively24F 10/10 19:48
ggirls: 入門本啊?

因為入門C++的書
我覺得要像effective比較有實用性
如果直接讀primer(字典)
會不知道你學的諸如constexpr, auto
要用在哪裡
但primer是一本好字典
我也有買一本原文版XD
https://i.imgur.com/gE1tdHS.png
[圖]
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 19:52:00
CorkiN: https://i.imgur.com/K5VgLaW.jpg 中文版第六版,可是我26F 10/10 20:00
[圖]
CorkiN: 好久沒看了荒廢有點久qq27F 10/10 20:00

plus版本好像又不一樣喔
plus好像沒有說得像prime那麼深入..
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:03:09
HuangJC: 要死了啊,當年 win 出現,逼退一狗票 dos 下自己學的工28F 10/10 20:05
HuangJC: 程師;現在這出現是要逼退我了,以後只剩張嘴了..
zxcvfr99: auto有時候還是不太行,不能當主力用,之前eigen有遇過30F 10/10 20:07
zxcvfr99: 個問題就是用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了

但可以用上面的方式先檢查推導出來的型別

CorkiN: 姆咪,我之前都不知道有兩個版本,剛上網查了一下好像plu32F 10/10 20:08
CorkiN: s版比較淺沒錯
但是沒有plus版有點像在看天書..
現在5e版本好一點了
我看原文覺得不會太難
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:20:07
angellll: 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
Refauth: 什麼是 鐵鏽?35F 10/10 20:25
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 20:25:45
momo4th: 新手還是玩python 吧 這篇第一段看完直接放棄36F 10/10 21:01
Shinpachi: 新手先從python了解程式的樂趣邏輯,之後再碰c也不錯37F 10/10 21:17
Shinpachi: 好文推

C語言開始就比較需要對電腦的了解了

舉個題目

1)請把CPU周邊的配置畫出來

2)承上,我從鍵盤打入A,到螢幕顯示A,試問經過哪些CPU周邊?
※ 編輯: dzwei (118.166.124.76 臺灣), 10/10/2020 21:32:42
Tenging: 跪著看 謝謝無私分享39F 10/10 22:43
breadking: 竟然大部分看得懂 好港動...謝謝我的OOP老師40F 10/10 22:57
SuperUnison: 推推推41F 10/11 00:09
lose116315: 三小42F 10/11 00:37
abbag: 推= =43F 10/11 00:50

--
※ 看板: Gossiping 文章推薦值: 0 目前人氣: 0 累積人氣: 346 
作者 dzwei 的最新發文:
點此顯示更多發文記錄
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇