看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《BearTsao (聽說有個東西叫臉書??)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC2008 : 問題(Question): : int Sum=0; : vector<int> vec; : vector<int>::iterator iter; : iter = find(vec.begin(), vec.end(), 某值); : 接下來就會有問題 : Sum = count(iter+1, vec.end(), 某值); 在你對一個迭代器作 ++it, it++, it + n, 等操作, 需要達成以 下前提: it 必須為 Dereferenceable(可提取的) *it 取值的行為必需是被定義好的, 你才可以讓它往前步進, 再 者, 標準不保證 STL 容器成員 end() 回傳的 past-the-end 迭 代器都是可提取的, 你前置條件若是錯掉, 後面也不用玩了 assert( iter != vec.end() ); std::count( iter+1, vec.end(), some_value); : 我想要計算iter+1 到 vec.end()之間某值出現的個數,但會出現問題 : 若改為 Sum = count(iter, vec.end(), 某值); 則不會有問題 假如 find() 那步沒找到目標, 這裡你等同於呼叫: std::count( vec.end(), vec.end(), some_value); 因為區間 [vec.end(), vec.end()) 並沒有任何元素, 演算法不作 事情直接回傳 : std::iterator_traits< vector<int>::iterator >::difference_type(0); : 另外一種情形,假設 : iter = vec.begin(); : if(*iter+1 == 某值) 這裡也會有錯誤 : { : Do some thing; : } 這裡有兩種情形 (1) iter is dereferenceable 等同於比較迭代器指到對象的值 +1 是否等於 某值 (2) iter isn't dereferencable 在取值的時候就錯掉了, 無法保證程式可以正常執行 : 想在Release Mode下執行,但會出現這些問題 : 麻煩指點迷津了。 題外話, STL 迭代器分為五類, 而敘述: 迭代器 + 常數 常數 + 迭代器 是屬於 Random access iterators 特有的操作, STL Containers library 裡只有 array、vector、deque 的迭代器可以滿足你程式 碼的需求, 所以之後的擴充性就少一半 善用 typedef 是很好的, 你可以多寫一些迴圈, 全用 vector<int> ::iterator 來跑, 然後再試著把 vec 的型態改成 list<int> -- ★ ★ ███ ███ █▌█ ██◣ ███ ▋▋█ █▂█ █▃█ ███ █▆█ █▄█ ███ █ ◣ █ █ ▋██ █▆◤ ███ ███ 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
BearTsao:謝謝版主,可能自己程式寫的不夠嚴謹@@ 12/25 22:21
Favonia:it + n 的前置條件有包含 dereferenceable 嗎? 12/26 00:05
Favonia:根據 C++98 24.1.5 (Table 76) 只有 n > 0 時才區要管吧 12/26 00:06
Favonia:(對不起打錯字了 orz... 才「需」要管) 12/26 00:10
Operational "Semantics", 補充 n 為正數, 忘記說清楚 ※ 編輯: loveme00835 來自: 140.121.197.115 (12/26 00:34)