Re: [討論] 大家都怎麼學STL?
※ 引述《n91324 (不丹)》之銘言:
: 最近想開始學STL
: 因為學C++不會STL感覺就是少了很多東西
: 所以想說自己買書來看
: 侯捷的 C++標準程式庫 好像是不少人推荐的
這本'中譯本'不錯, 可以當字典查
: 入門看這本OK嗎?
: 順便想問一下大家都怎麼學STL的? 想學的動機又是什麼?
我的動機就是不想寫跟同學一樣的程式碼, 常常看到這個:
for(int i = 0; i < 10; i++ ) // 型態就定錯了
array[ i ] = 0;
之後又翻了一下文件, 發現有比較簡短的寫法:
memset( array, 0, sizeof(array) );
C++裡則可以用:
std::fill( array, array + 10, 0 );
它為我帶來的不只是更簡潔的寫碼方式, 其實還有更高的可讀性
(雖然透過迭代器尋訪容器到auto的出現才有改善一點點)
STL不只是Algorithms + Containers, I/O Stream也可以算在其
中, 只是它用到所謂Concepts的地方比較少, 在使用前你不只要
清楚 template function/class template 的基本語法, 甚至設
計的時候也要考慮到很多因素( 避免提供過大彈性導致發行後才
發現設計欠佳), 我就曾在學弟的程式碼中看到這個問題:
template <class T>
T MyStack::pop()
{
if( !empty() )
return memory[ --top ];
return T(0);
}
在堆疊為空時, 學弟選擇的是回傳一個以零為初始值的物件而
非使用擲出例外的方式來取代, 這有什麼壞處?
MyStack<int> int_stack; // 沒問題
MyStack<float> float_stack; // 這...勉強可以
MyStack<std::string> str_stack; // 有發現問題嗎?
另外這個函式也必須明確說明堆疊元素滿足何種Concepts, 如
果該概念不包含在現有的STL中, 那你必須要自己創一個, 以
上的例子即需要:
Copy Constructible
Zero Initializable (可用零來初始化, 必要時必須解釋為
整數符號0)
更嚴苛的還要注意建構/解構子是否在該呼叫環境下可用(非私
有成員), 透過'泛型程式設計'可以訓練這一塊, 也可以比較
了解身為可以和STL Algorithms/Containers 銜接的東西, 需
要滿足何種條件.
我看的書主要挑 Addison-wesley 出版的原文書(文字上細微的
語意差別, 中文無法表達), 像是 C++ In-Depth Series這系列
就不錯, 研究源碼首推Boost, 不過到你會用到再來看就好了,
因為當你需要寫很多碼來完成一件工作時, 首先考慮的應該是
換個語言寫.
: 因為學校老師基本上也不太會去教(STL不是很重要嗎@@?)
不教有部分是因為上面講到的設計議題, 要講完不曉得要多少
學分了, 再來是把C++寫得好像其他直譯器語言也是有人比較
不能接受, 我們系上的老師就是這樣@"@
: 問了一下學校的學長
: 發現很多學長也沒有特別去接觸
你眼中的C++ vs 他人眼中的C++
小弟剛上大學時就擔任寫程式給別人抄的角色, 剛開始修C語言
時還好都有人看得懂, 不過修C++時只要導入新特性就會有人開
始該該叫了(現在做研究學長也特別叮嚀我別寫模版). 你應該
視合作的對象來決定如何應用所學, 一輩子都不需要去碰到的
話, 當成興趣來玩就好了...
C++支援 OOP並不代表都要用物件來把資料抽象化, C++提供STL
也不代表你硬要apply它, 像是:
int q = 1;
std::for_each( array, array + 10, []( int &a ) {
a = q;
q *= 2;
}
);
這個部分 generate 就會比 for_each 適用, 因為它們對迭代
器的需求不太一樣(ForwardIterator/InputIterator), 編譯可
能會過, 卻不自覺寫出沒可攜性的程式.
--
★ ★ ★ ★
★ ★ ★ ███ ███ █ █▌█ ██◣ ███ ▋▋█ ★ ★ ★
█▂█ █▃█ █ ███ █▆█ █▄█ ███
★ ★ █ ◣ █ █ █ ▋██ █▆◤ ███ ███ ★ ★
Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook
φwindyhorse No Eul Oh Seung A Jung Yoon Hye
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
※ 編輯: loveme00835 來自: 140.121.197.115 (09/25 19:31)
推
09/25 20:53, , 1F
09/25 20:53, 1F
→
09/25 20:56, , 2F
09/25 20:56, 2F
→
09/25 20:56, , 3F
09/25 20:56, 3F
→
09/25 20:57, , 4F
09/25 20:57, 4F
推
09/25 22:05, , 5F
09/25 22:05, 5F
推
09/25 22:10, , 6F
09/25 22:10, 6F
→
09/25 22:11, , 7F
09/25 22:11, 7F
→
09/25 22:11, , 8F
09/25 22:11, 8F
推
09/25 22:17, , 9F
09/25 22:17, 9F
for 通常都是計數用的
for(size_t i = n - 1; i >= 0; --i) /**/;
以上的敘述雖可以反著尋訪元素, 但也多出了 n - 1 這樣離奇的敘述,
如果正向/反向交互使用, 個人覺得code會雜亂許多, STL 提供
std::reverse_iterator 配接器, 且多數容器皆提供rbegin()、rend()
, 不用因判斷邊界條件錯誤而當機, 所以還蠻方便的!
FIDS 加入了 std::array 模版, 更減少了魔法數字的使用
※ 編輯: loveme00835 來自: 140.121.197.115 (09/25 23:24)
推
09/25 23:32, , 10F
09/25 23:32, 10F
→
09/25 23:33, , 11F
09/25 23:33, 11F
推
09/25 23:46, , 12F
09/25 23:46, 12F
→
09/26 09:19, , 13F
09/26 09:19, 13F
→
09/26 09:19, , 14F
09/26 09:19, 14F
推
09/26 09:57, , 15F
09/26 09:57, 15F
推
09/26 23:37, , 16F
09/26 23:37, 16F
推
09/26 23:39, , 17F
09/26 23:39, 17F
→
09/26 23:52, , 18F
09/26 23:52, 18F
推
09/26 23:56, , 19F
09/26 23:56, 19F
推
09/27 00:47, , 20F
09/27 00:47, 20F
→
09/27 00:48, , 21F
09/27 00:48, 21F
→
09/27 00:49, , 22F
09/27 00:49, 22F
推
09/27 01:17, , 23F
09/27 01:17, 23F
→
09/27 01:18, , 24F
09/27 01:18, 24F
推
09/27 01:19, , 25F
09/27 01:19, 25F
→
09/27 03:00, , 26F
09/27 03:00, 26F
推
09/27 10:41, , 27F
09/27 10:41, 27F
推
09/27 18:46, , 28F
09/27 18:46, 28F
推
09/28 00:25, , 29F
09/28 00:25, 29F
→
09/28 00:26, , 30F
09/28 00:26, 30F
推
09/28 02:52, , 31F
09/28 02:52, 31F
推
12/10 01:16, , 32F
12/10 01:16, 32F
討論串 (同標題文章)