c++ - 在带有 bind2nd 和 string::compare 的 std::vector<std::string> 上使用 find_if

标签 c++ stl

这似乎是一个学术问题,但我仍然对答案非常感兴趣:

我有一个字符串 vector s,我想在其中找到给定的字符串findme。这可以使用类似的东西来完成

find(s.begin(), s.end(), findme);

我的问题是:必须有一种方法可以使用 find_if 和 STL 字符串的 compare 方法作为谓词来做同样的事情,但是怎么做呢?有点像

find_if(s.begin(), s.end(), bind2nd(mem_fun_ref(&string::compare), string("findme")) );

不起作用,因为比较方法有多个重载,编译器不知道选择哪一个。

作为第二步:我使用 find_if 而不是 find 的动机是我有一个从具有字符串属性 name 的类派生的对象 vector ,我想找到一个给定的对象姓名。这可能吗(无需编写额外的函数用作谓词)?


编辑:正如一些(大多数 :) 提到的使用 Boost 的答案——我宁愿不必为此包含 Boost。 (据我所知,大多数 Boost 库都是“唯一的”模板,因此应该有一种不使用 Boost 的方法。)

最佳答案

一个选项是将成员函数指针转换为合适的类型。您忘记的另一件事是 std::string::compare 为相等的字符串返回 0,因此您还需要取反仿函数。总而言之:

std::find_if(
    vec.begin(), vec.end(),
    std::not1(
        std::bind2nd(
            std::mem_fun_ref(static_cast<int (std::string::*)(const char*)const>(&std::string::compare)),
            "findme"
        )
    )
);

关于您反对 boost 的理由:它的模板比您在 STL 函数头文件中找到的模板灵活一个数量级。它要么是 boost,你等待 C++0x lambdas(我相信在这种情况下这将是更好的方式),要么你自己编写一些帮助程序。目前它不能比以下更简单:

std::find_if(vec.begin(), vec.end(), boost::bind(&X::name, _1) == "findme");

仅供引用,C++0x 将添加类似于 boost::bind 的 std::bind,但似乎重载 operator== 的便利性不会存在。

关于c++ - 在带有 bind2nd 和 string::compare 的 std::vector<std::string> 上使用 find_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1378867/

相关文章:

c++ - 为什么在模板函数中使用 iterator_traits 而不是仅仅使用另一个模板类型参数?

c++ - 带有 vector 作为键的 STL 映射

c++ - 什么是内斜接计算?

c++ - Objective-C 实例到 C++ 类

c++ - 如何检查通过引用返回的函数的正确操作数?

c++ - 我可以防止使用重载运算符 == 与 NULL 进行比较吗?

c++ - 具有 n 个参数的宏

c++ - QSharedPointer VS std::tr1::shared_ptr VS boost::tr1::shared_ptr

c++ - 带有 std::priority_queue 的最小堆是我的瓶颈

c++ - 带有自定义构造函数的自定义 STL 分配器