在tr1 :: shared_ptr的向量中查找元素

时间:2013-01-10 07:55:40

标签: c++ boost stl find shared-ptr

我已将自定义类型“MyType”包装在智能指针中:

tr1::shared_ptr<MyType>

并从中制作了一个矢量:

vector<shared_ptr<MyType>>

现在我希望std::find在该向量中MyType类型的对象但不能,因为我需要的类型为shared_ptr<MyType>

有优雅的方式吗? 谢谢

更新:为什么不用std :: find_if:std :: find的用法非常紧凑。我认为为find_if实现一个方法或函子将是一个太大的开销。

2 个答案:

答案 0 :(得分:8)

做你想做的事的惯用和优雅方式是:

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::vectorstd:shared_ptr,那么您显然已经在使用STL了。那么为什么不使用std::find_if?如果您不能使用C ++ 11 lambda表达式,则始终可以使用函数对象。

答案 1 :(得分: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 / boost方式来做某事,但又不想使用优雅的STL方式来做到这一点?听起来不对。