作者loveme00835 (高髮箍)
看板C_and_CPP
標題Re: [問題] Vector iterator的移動
時間Sun Dec 25 21:55:38 2011
※ 引述《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)