2010-11-22 10 views
6
私はこのようなコードを持って

....ベクトル内の要素を検索する方法は?

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

「asdasda」は、ベクターの一部でない場合は、いくつかのゴミとCOUTにPポイントは、ワンセグ障害を与えます。 coutが "asdasda"だけを実行するようにするif文は何でしょうか? また、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」であることをどのように知ることができますか? –

+0

@Prasanth:私のコードの2行目を参照してください。 – kennytm

+0

@ kenny:ありがとう....そのv.begin()..:P –

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が失敗した場合、検索は[start, finish)あるとstartが、除外finishが含まれているため、それがfinishイテレータを返します。

1

Findは、検索した値が見つからない場合は、終了イテレータを返します。 表示行の直前にif (p != v.end())を追加することで、エラーを回避できます。

+0

vの "asdasda"の位置を見つける方法..先に宣言したようにv [ 3]を "asdasda"とすると、どのようにしてv [3]が "asdasda"であるかを知ることができますか? –

+0

'p!= v.end()'なら 'p - v.start()'です。 – Flinsch

関連する問題