2010-11-22 127 views
6

我有一個這樣的代碼....如何搜索矢量中的元素?

std::vector<string>::iterator p; 
p = find(v.begin(),v.end(),"asdasda"); 
cout << *p << endl; 

如果「asdasda」不是載體的一部分,p指向一些垃圾和cout給出賽格故障。如果if語句會使cout執行只發現「asdasda」,應該怎麼辦? 以及v中「asdasda」的位置..就像我們之前宣稱v [3]爲「asdasda」, 那麼我怎麼能從發現v [3]是「asdasda」?

回答

12

p不指向「垃圾」,只是在沒有找到內容時變成v.end()

if (p != v.end()) { 
    std::cout << "v[" << (p - v.begin()) << "] = "; 
    std::cout << *p << std::endl; 
} 
+0

如何在v中找到「asdasda」的位置..就像我們之前宣稱v [3]爲「asdasda」,那麼我怎麼能從發現v [3]是「asdasda」? – 2010-11-22 07:26:20

+0

@Prasanth:查看我的代碼的第二行。 – kennytm 2010-11-22 07:26:46

+0

@ kenny:thanks ....它的v.begin()..:P – 2010-11-22 07:29:20

4

如果std::find沒有找到任何東西,迭代器在這種情況下設置爲v.end()

if (p != v.end()) 
{ 
    // iterator is good 
} 

另請注意std::find的一般情況。

下面是它的一個典型的定義:

namespace std { 
    template <class InputIterator, class T> 
    InputIterator find(InputIterator start, 
        InputIterator finish, 
        const T& value); 
} 

如果std::find失敗,它將返回finish迭代,因爲搜索是[start, finish)包括start但不包括finish

1

查找返回結束迭代器,如果它沒有找到您搜索的值。 您可以通過在顯示行之前加上if (p != v.end())來避免您的錯誤。

+0

如何在v中找到「asdasda」的位置..就像我們之前聲明的v [ 3]作爲「asdasda」,那麼我怎麼能從發現v [3]知道「asdasda」? – 2010-11-22 07:26:03

+0

'p - v.start()',如果'p!= v.end()'。 – Flinsch 2010-11-22 07:29:31