在std :: list中查找

时间:2014-04-09 14:01:09

标签: c++ algorithm list c++11 stl

请告诉我如何使用STL做到最好。

我的班级有成员std::list<SomeObject*>。这是私人会员。我只有const_iterator开始和结束。

我想检查列表是否有一些价值。我需要检查几个值。我可以访问SomeObject的成员。 如何做到最好?

我想使用std::findstd::any_of或者像那样。但我不想定义几个谓词函数。 列表有指针,所以我无法定义operator==

我可以使用C ++ 11。

2 个答案:

答案 0 :(得分:1)

你需要更具体一点。一种方法是使用传递给find函数的函数,该函数包含成功返回的策略。类似的东西:

//You could also use a public member function of the Test class that provides the policy
bool my_find_function( const Test* item ) 
{
   return item->id == 10;
}
list<Test*>::const_iterator found = find_if( list.begin(), list.end(), my_find_function);

但老实说,网上有很多STL容器的例子,我很确定,Stackoverflow上有很多结果。检查本页右上角的搜索功能。

答案 1 :(得分:0)

如果您不想在解除引用的对象上为std :: find和call = =提供谓词,则可以使用迭代器适配器自动取消引用指针。 Boost有一个这样的迭代器的实现,但是编写自己的并且有一个很方便。

#include <boost/iterator/indirect_iterator.hpp>

bool finder(std::list<SomeObject*>::const_iterator fist, 
            std::list<SomeObject*>::const_iterator last, 
            SomeObject const& x) 
{
   return std::find(boost::make_indirect_iterator(first),
                    boost::make_indirect_iterator(last),
                    x) != last; 
}

但是这只在你想使用operator ==时才有意义。如果你有不同的谓词,要么将它们定义为函数,要么在本地将它们定义为lambda函数。