3

カスタム タイプ 'MyType' をスマート ポインターでラップしました。

tr1::shared_ptr<MyType>

それからベクトルを作成しました:

vector<shared_ptr<MyType>>

今、そのベクターstd::findのタイプのオブジェクトが必要ですが、必要なタイプが.MyTypeshared_ptr<MyType>

エレガントな方法はありますか?ありがとうございました

更新: std::find_if ではない理由: std::find の使用法はかなりコンパクトです。find_if のメソッドまたはファンクターを実装すると、オーバーヘッドが大きすぎると思いました。

4

2 に答える 2

11

あなたが望むことを行うための慣用的でエレガントな方法は次のとおりです。

std::vector<std::shared_ptr<MyType>> v;

// init v here;

MyType my_value;

// init my_value here;

auto it = std::find_if(v.begin(), v.end(), [&](std::shared_ptr<MyType> const& p) {
    return *p == my_value; // assumes MyType has operator==
});

if (it != v.end()) { /* do what you want with the value found */ }

std::vectorとを使用できる場合std:shared_ptrは、明らかに STL を既に使用しています。では、なぜ使用しないのstd::find_ifですか?C++11 ラムダ式を使用できない場合は、いつでも関数オブジェクトを使用できます。

于 2013-01-10T08:14:56.167 に答える
1

find_if に対する嫌悪感を無視して、投稿した質問にのみ答えるには:

std::vector<std::shared_ptr<MyType>> myVector; 
/* ... */
MyType const& whatIAmlookingFor = /* ... */;
auto ptr = std::find_if(begin(myVector), end(myVector), [&](std::shared_ptr<MyType> const& current)
{
  return *current == whatIAmLookingFor;
});

「何らかの理由で」 find_if を使用したくない場合 (どのような理由が考えられますか?): 何かを行うためのエレガントな STL/ブーストの方法を探していますが、エレガントな STL の方法を使用したくありません。やれ?正しく聞こえません。

于 2013-01-10T08:15:55.750 に答える