Re: [問題] Vector iterator的移動
※ 引述《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
→
12/25 22:21, , 1F
12/25 22:21, 1F
→
12/26 00:05, , 2F
12/26 00:05, 2F
→
12/26 00:06, , 3F
12/26 00:06, 3F
→
12/26 00:10, , 4F
12/26 00:10, 4F
Operational "Semantics", 補充 n 為正數, 忘記說清楚
※ 編輯: loveme00835 來自: 140.121.197.115 (12/26 00:34)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章