3

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

tr1::shared_ptr<MyType>

并从中制作了一个向量:

vector<shared_ptr<MyType>>

现在我想要该向量std::find中的类型对象,MyType但不能因为我需要的类型是shared_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::vectorand std:shared_ptr,那么您显然已经在使用 STL。那么为什么不使用std::find_if呢?如果你不能使用 C++11 的 lambda 表达式,你总是可以使用一个函数对象。

于 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/boost 方式来做某事,但不想使用优雅的 STL 方式来做某事做吗?听起来不对。

于 2013-01-10T08:15:55.750 回答