2010-11-22 97 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