2012-07-10 100 views
0

我具有下面給出(在C++)的形式的矢量:通過矢量搜索問題?

vector<pair<int,int> > u; 

現在,當u.first的第一個元素變成等於12然後我想從環斷裂。我使用下面的代碼是:

while(1){ 
    if((find(u.begin().first, u.end().first, 12)!=u.end().first)) 
      { 
        break; 
      } 
    } 

然而,它給我的錯誤

 'unable to resolve identifier first' 
+0

James的答案是很好的解決方法。我會指出其他一些事情。其一,請注意'begin()'和'end()'返回迭代器類型,所以'.'對它們無效。二,即使你*能*操作它們,'end()'不會引用最後一個元素;它指的是超出*的一個位置,因此除了作爲終止符以外永遠無法使用。一個'vector'包含特殊的非迭代器方法,名爲'front()'和'back()',當你想直接檢查值時很有用。 (這只是供參考;在這種情況下,你無法真正地參考元素;請參閱詹姆斯的答案。) – 2012-07-10 05:45:49

+0

如果查找返回false而成爲無限,則很危險。 – PersianGulf 2012-08-17 15:49:08

回答

1

std::find遍歷一個範圍相匹配的序列中返回一個迭代器的第一個元素提供的價值(12,就你的情況而言)。迭代器不是容器中的元素,它們是容器中元素的僞引用。

您必須取消引用迭代器才能獲取元素。因此,u.begin()->first將是容器初始元素的first值。 u.begin().first是無意義的。

在任何情況下,要使用除==以外的操作來查找匹配元素,您需要使用帶自定義謂詞的find_if。例如,使用lambda表達式:

auto const it(std::find_if(u.begin(), u.end(), [](std::pair<int, int> const& v) 
{ 
    return v.first == 12; 
})); 

if (it != u.end()) 
    continue; 
+0

感謝您的幫助...... std :: pair之前的[]意味着什麼 – user1355603 2012-07-10 05:38:00

+0

它也會返回...這個返回意味着什麼......'continue'或'break' – user1355603 2012-07-10 05:40:27

+0

這是一個lambda表達式。 find_if將爲每個元素調用lambda,如果元素匹配,則lambda返回true。然後find_if將返回迭代器到find_if返回true的第一個元素(或者如果lambda沒有元素返回true,則返回u.end())。然後您需要將迭代器與u.end()'進行比較,以查看是否找到了匹配項。 – 2012-07-10 05:42:37