7

オブジェクトが見つかった場合にイテレータを返す関数があります。

今、私は問題を抱えています。この関数を呼び出したオブジェクトにオブジェクトが見つからなかったことを通知する問題を修正するにはどうすればよいですか?

vector<obj>::iterator Find(int id, int test)
{
        vector<obj>::iterator it;
            aClass class;

            for(it = class.vecCont.begin(); it != class.vecCont.end(); ++it)
            {
               if(found object) //currently in psuedo code
               return it;
            }

            return ???? // <<< if not found what to insert here?

}

代わりに、これでデータ構造を変更する必要がありますか?

前もって感謝します!:)

4

7 に答える 7

7

戻るvector::end()、例外をスローする、または単純なイテレータ以外のものを返す

Findさらに良いことに、独自の関数を実装しないでください。それが<algorithm>ライブラリの目的です。擬似コードに基づいて、おそらくstd::findまたはを使用できますstd::find_iffind_if平等が必ずしも意味しない場合に特に役立ちoperator==ます。そのような場合は、[C ++ 11]ラムダを使用できます。また、C ++ 11が使用できない場合は、ファンクタークラスを使用できます。

ファンクターは最小公分母なので、それから始めましょう。

#include <cstdlib>
#include <string>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;

class Person
{
public:
    Person(const string& name, unsigned age) : name_(name), age_(age) {};

    string name_;
    unsigned age_;
};

class match_name : public unary_function <bool, string>
{
public:
  match_name(const string& rhs) : name_(rhs) {};
  bool operator()(const Person& rhs) const
  {
    return rhs.name_ == name_;
  }
private:
    string name_;
};

#include <iostream>

int main()
{
    vector<Person> people;
    people.push_back(Person("Hellen Keller", 99));
    people.push_back(Person("John Doe", 42));

    /** C++03 **/
    vector<Person>::const_iterator found_person = std::find_if( people.begin(), people.end(), match_name("John Doe"));

    if( found_person == people.end() )
        cout << "Not FOund";
    else
        cout << found_person->name_ << " is " << found_person->age_;
}

found_person「JohnDoe」という名前の人を指すようになりました。またはpeople_.end()、その人が見つからなかった場合は指します。

C ++ 11ラムダは、ファンクターを宣言/定義するこのプロセスを作成する新しい言語構文であり、多くの場合、使用がいくらか簡単になります。これは次のように行われます。

string target = "John Doe";
vector<Person>::const_iterator found_person = std::find_if(people.begin(), people.end(), [&target](const Person& test) { return it->name_ == target; });
于 2012-05-09T19:33:39.373 に答える
5

イテレータを最後に戻すことができます。つまりreturn class.vecCont.end()、それを示すことができます。

于 2012-05-09T19:33:35.040 に答える
3

エンドイテレータを返すだけではどうですか?

コードは次のようになります:-

vector<obj>::iterator Find(int id, int test)
{
   vector<obj>::iterator it;
   aClass class;

   for(it = class.vecCont.begin(); it != class.vecCont.end(); ++it)
   {
     if(found object) //currently in psuedo code
       break;
   }

   return it;
}

または単にを使用しますstd::find

于 2012-05-09T19:34:43.347 に答える
1

class.vecCont.end()オブジェクトが見つからなかった場合は戻る必要があります。しかし、@chrisは正しいです-これはまさにそのstd::find目的です。

于 2012-05-09T19:33:42.110 に答える
1

このようなもの

std::vector<obj>::iterator pos;
pos = find(coll.begin(),coll.end(), val);

そして、これらの要素がコンテナに存在するかどうかを確認することを忘れないでください

if (pos != coll.end()) 
于 2012-05-09T19:34:50.073 に答える
0

std::algorithmクラス内で関数をエミュレートしないでください。それらは理由のために無料の機能です。通常は、適切なイテレータ(および場合によっては)を返すメンバー関数を公開するだけでbegin十分endですboost::iterator_range。ファンクターを使用して派手な検索を行う必要がある場合は、ファンクターも公開します。

于 2012-05-09T19:39:36.967 に答える
0

イテレータを非表示のコンテナに戻さないでください。必要なもの、つまりオブジェクトが存在する場合はそれにアクセスする手段を単純に返します。この例では、オブジェクトをポインターを介してコンテナーに格納します。オブジェクトが一時的にしか存在しない場合は、オブジェクトを新しく作成して、オブジェクトをコピーします。

class AClass;

//...some time later
std::vector<AClass*> vecCont; //notice, store pointers in this example!

//..some time later
AClass * findAClass(int id, int test)
{
  vector<AClass*>::iterator it;

  for(it = class.vecCont.begin(); it != class.vecCont.end(); ++it)
  {
     if(found object) //currently in psuedo code
     return it;
  }

  return NULL;
}

//later still..

AClass *foundVal = findAClass(1, 0);
if(foundVal)
{
  //we found it!
}
else
{
  //we didn't find it
}

編集:賢明なことは、クラスのコンパレーターを作成し、stdアルゴリズムのソートを使用してそれらを見つけることです。ただし、やりたいことをしてください。

于 2012-05-09T19:43:42.093 に答える