C++ 在tr1::shared\u ptr的向量中查找元素

C++ 在tr1::shared\u ptr的向量中查找元素,c++,boost,stl,find,shared-ptr,C++,Boost,Stl,Find,Shared Ptr,我已将自定义类型“MyType”包装在智能指针中: tr1::shared_ptr<MyType> tr1::共享 并从中得到一个向量: vector<shared_ptr<MyType>> 向量 现在我想在该向量中找到std::类型为MyType的对象,但是找不到,因为我需要的类型是shared\u ptr 有优雅的方式吗? 多谢各位 更新:为什么不使用std::find_如果:std::find的用法非常紧凑。我认为为find_if实现一个方法或f

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

tr1::shared_ptr<MyType>
tr1::共享
并从中得到一个向量:

vector<shared_ptr<MyType>>
向量
现在我想在该向量中找到
std::类型为
MyType
的对象,但是找不到,因为我需要的类型是
shared\u ptr

有优雅的方式吗? 多谢各位


更新:为什么不使用std::find_如果:std::find的用法非常紧凑。我认为为find_if实现一个方法或functor的开销太大了。

实现所需功能的惯用且优雅的方法是:

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 v;
//这里是init v;
MyType my_值;
//在这里初始化我的值;
auto it=std::find_if(v.begin()、v.end()、[&](std::shared_ptr const&p){
return*p==my_value;//假设MyType有运算符==
});
如果(it!=v.end()){/*对找到的值执行所需操作*/}

如果您可以使用
std::vector
std:shared\u ptr
,那么显然您已经在使用STL了。那么为什么不使用
std::find_if
?如果您不能使用C++11 lambda表达式,您可以始终使用函数对象。

只回答您发布的问题,忽略您对find\u的厌恶,如果:

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;
});
std::vector myVector;
/* ... */
MyType const&whatIAmlookingFor=/*…*/;
自动ptr=std::find_if(begin(myVector),end(myVector),[&](std::shared_ptr const¤t)
{
return*current==whatIAmLookingFor;
});
现在,关于您不想使用find_if“出于某些原因”(可能是什么原因?):
您正在寻找一种优雅的STL/boost方式来做某事,但不想使用优雅的STL方式来做吗?听起来不对。

您可以为共享ptr定义运算符“==”,但唯一优雅、不会污染代码的方法是使用find_if,如果唯一的方法是使用find_if,则使用find_if。这里引用()-
注意,共享的\u ptr的比较运算符只是比较指针值;不会比较指向的实际对象。
使用标准库的方法是使用
find\u if
。什么东西你不能用?对不起;我真的希望您解释一下为什么不想使用
find\u if
。因为这是正确的解决方案,只是把这句话扔出去是没有帮助的。@BenjaminLindley异构比较运算符是维护的噩梦,因为您还需要普通比较的左/右对称性,并且您必须担心隐式转换等。很酷,谢谢,这很有帮助。我不知道我可以使用lambda表达式。Sry用于“不想找到”if注释。我不想使用find_if,因为在我看来,编写比较方法/函子不会比自己查找值更紧凑。但你的解决方案是有效的,这正是我想要的。