2013-10-07 59 views
0
list<int> a; 

list <int> ::iterator it; 

it = a.begin(); 

it=a.insert(it,10); 
it=a.insert(it,210); 
it=a.insert(it,310); 
it=a.insert(it,410); 
it=a.insert(it,510); 


it = find(a.begin(),a.end(),180); 

cout << *it << endl; 

在此程序中,值180不在此列表中。所以按照找到的STL算法,它應該返回最後一個值,但是當我打印這個值時,它會產生垃圾。似乎迭代器指向其他某個位置。請幫我發現我的錯誤。預期返回查找STL算法

+2

'端()'是不是在容器中的最後一個項目時,它是代表一個過去的結束萬能筆。 –

回答

1

std::find返回end()如果在STL容器中找不到元素,解除引用end()是未定義的行爲。

您需要取消引用前測試迭代it它:

it = find(a.begin(), a.end(), 180); 
if (it != a.end()) 
{ 
    cout << *it << endl; 
} 

§25.2.5

返回:第一個迭代器I的範圍是[第一,最後),其下述相應條件成立:* i ==值,pred(* i)!= false,pred(* i)== false。如果沒有找到這樣的迭代器,則返回last。

範圍[first,last)是半開的範圍,last意味着在容器end()不最後一個元素。

+0

返回值: - 一個迭代中的範圍內,其比較等於VAL第一個元素。 如果沒有元素匹配,該函數返回最後....這是發現C++的網頁說什麼 –

+0

或最後的手段'端()'在這種情況下 – billz

+0

不,他們已經給了發現,這的確意味着代碼它是最後一個元素,[鏈接](http://www.cplusplus.com/reference/algorithm/find/) –

2

a.end()不是最後一個值的迭代器,而是迭代器,它是過去的列表中的最後一個元素。不應以任何方式打印或訪問它。在std::find的情況下,你應該比較的返回值來結束迭代。如果匹配,那個容器中沒有與請求值匹配的元素。

it = find(a.begin(),a.end(),180); 
if(a.end() == it) { // using Yoda conditional 
    cout << "no element matching value.." << endl; 
} else { 
    cout << *it << endl; 
}