【问题标题】:Finding in std::list在 std::list 中查找
【发布时间】:2014-04-09 14:01:09
【问题描述】:

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

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

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

我想使用std::findstd::any_of 或类似的东西。但我不想定义几个谓词函数。 List 有指针,所以我不能定义operator==

我可以使用 C++11。

【问题讨论】:

  • 你可以在需要的时候指定一个lamdba
  • 如果您不想定义谓词函数(或 lambdas),那么您就不走运了。
  • Lambda - 我认为这是个好主意。我不知道。谢谢棘轮怪胎。

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


【解决方案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 上有很多结果。检查此页面右上角的搜索功能。

【讨论】:

  • 你觉得这个好看吗? 15 个函数,例如:my_find_function1、my_find_function2、my_find_function3、my_find_function4 .... ?我认为这不是一个好主意。但也许你是对的。感谢您的回复。我可以用谷歌解决这个原始问题。我请高级程序员告诉我如何做到最好,最好。
  • @pawell55555:如果您需要 15 个函数,那么您的代码设计可能一开始就不好。有很多可能的方法来实现一个拟合函数(你可以使用你的测试项目的一个虚拟成员函数,正如我评论的那样......但是在不知道真实代码的情况下,这一切都是自以为是的。你知道你的代码,自己掌握它. ;)
【解决方案2】:

如果您不想为 std::find 提供谓词并在取消引用的对象上调用 operator==,您可以使用自动取消引用指针的迭代器适配器。 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 函数。

【讨论】:

  • 非常感谢。它看起来很棒,但我有一个问题。我已经定义了 operator== bool operator==(const SomeObject& x, const SomeObject& y) { return x.id &)' : 无法推断出 'const std::complex 的模板参数<_other> &' from const SomeObject ... 和其他错误。 :(
  • 我使用 Visual Studio 2005。
  • 看起来您正在将某些东西与 std::complex 对象进行比较?
  • 不,我有几个错误.. 看起来编译器找不到 operator==。最后一个错误是: error C2676: binary '==' : 'SomeObject' 没有定义此运算符或转换为预定义运算符可接受的类型....但是,如果我尝试通过键入来比较两个 SomeObject 类型的对象: x == y。没有错误。我不知道发生了什么事。 :(
  • 比较运算符匹配 std 命名空间中比较运算符的模板化版本之一。在 std 命名空间 { } 中定义您的运算符 == 以消除错误。
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2012-01-09
  • 2018-01-11
  • 2012-12-05
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多