[問題] vector在find函示中設定找尋範圍

看板C_and_CPP作者 (我一個人)時間9年前 (2016/03/09 23:27), 編輯推噓3(3011)
留言14則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 沒有 問題(Question): 一般來說要在vector找某筆資料可以使用find vector<string> v; v.push_back("50"); v.push_back("2991"); v.push_back("23"); v.push_back("9999"); vector<string>::iterator i = v.begin(); i = find(v.begin(), v.end(), "9999"); if (i != v.end ()) { int nPosition = distance (v.begin(), i); cout << "Value "<< *i; cout << " found in the vector at position: " << nPosition << endl; } else cout<<"not found"<<endl; 如果有找到就會回傳在vector所在位置,反之則說not found。 現在我有問題的地方在於要如何設定 "找尋範圍" 改成 i = find(v.begin()+2, v.end(), "2991"); 則會顯示not found 但如果是從 v.end()-1 就會變得怪怪的。 例子: i = find(v.begin(), v.end()-2, "9999"); Output: Value 23 found in the vector at position: 2 預期結果: not found 請問要如何修改呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.96.2 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1457537222.A.D04.html

03/09 23:28, , 1F
C++ 在以 iterator 指定範圍都是 [begin, end)
03/09 23:28, 1F

03/09 23:28, , 2F
也就是含頭不含尾, 因此你這樣指定時 23 是在範圍外
03/09 23:28, 2F

03/09 23:28, , 3F
你應該知道 .end() 會回傳指向最後一個元素的後一格
03/09 23:28, 3F

03/09 23:29, , 4F
這也是一樣的道理
03/09 23:29, 4F

03/09 23:35, , 5F
但我覺得奇怪的是 明明要找"9999" 但輸出23位置很奇怪
03/09 23:35, 5F

03/09 23:42, , 6F
... 你覺得 i 有可能等於 v.end() 嗎?.
03/09 23:42, 6F

03/09 23:43, , 7F
應該是搞錯 "結尾" 了. 那不是 23 的位置, 是 "結尾"
03/09 23:43, 7F

03/09 23:43, , 8F
阿 我好像了解什麼了 看來我累了...
03/09 23:43, 8F

03/09 23:44, , 9F
改了範圍 後面的v.end() 也必須更著改
03/09 23:44, 9F

03/10 00:08, , 10F
find沒找到會回傳第二個iterator 所以你i=v.end()-2
03/10 00:08, 10F

03/10 00:10, , 11F
你find的範圍用begin和end就好啦 幹嘛這麼搞剛
03/10 00:10, 11F

03/10 00:27, , 12F
因為我要處理2維vector 而且每個一維vector長度未知
03/10 00:27, 12F

03/10 00:28, , 13F
另外 每個一維vector最後一個元素必須忽略
03/10 00:28, 13F

03/10 00:29, , 14F
所以才必須這樣子~ 謝謝各位
03/10 00:29, 14F
文章代碼(AID): #1Mu436q4 (C_and_CPP)