我已将自定义类型“MyType”包装在智能指针中:
tr1::shared_ptr<MyType>
并从中制作了一个矢量:
vector<shared_ptr<MyType>>
现在我希望std::find
在该向量中MyType
类型的对象但不能,因为我需要的类型为shared_ptr<MyType>
。
有优雅的方式吗? 谢谢
更新:为什么不用std :: find_if:std :: find的用法非常紧凑。我认为为find_if实现一个方法或函子将是一个太大的开销。
答案 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::vector
和std: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方式来做到这一点?听起来不对。