【问题标题】:Custom C++ Predicate and find if自定义 C++ 谓词并查找 if
【发布时间】:2013-11-22 01:39:19
【问题描述】:

所以我有一个具有这种数据结构的作业

    struct ZipCode
{
    char s[4];
    int  zip;
    bool operator() (const ZipCode &lhs, const ZipCode &rhs) const
    {return lhs.s[1] < rhs.s[1];}
    bool operator() (const char* st, const int &z) const
    {return st == s && z == zip;}
    bool operator() (const int &z) const
    {return zip == z;}

};

然后我将这些数组插入到 STL:set 中,并试图稍后找到具有特定 zip 的数组。我通过像这样使用 find_if 来做到这一点

std::set<ZipCode, ZipCode>::iterator itz = find_if(mySet.begin(), mySet.end(),ZipCode()(0xbb77));

当我编译它时,我得到以下错误:

c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(83):错误 C2064:术语不计算为采用 1 个参数的函数

我不确定问题是什么或如何解决此问题

【问题讨论】:

  • 你还没有问过这部分,但我会告诉你 st == s 没有做你认为它在这个表达式中所做的事情:bool operator() (const char* st, const int &amp;z) const {return st == s &amp;&amp; z == zip;}
  • 哇,我有点惊讶我错过了。把它换成strcmp(st,s) 虽然它工作正常,我有点惊讶你现在指出了它。
  • 如果编译器折叠它们以共享相同的存储空间,您可能会在字符串常量上走运。 IE。第 100 行上的 "abc" 和第 200 行上的 "abc" 可能在生成的可执行文件中位于相同的位置,所以指向它们的指针会因为运气而比较相等。不过,我绝不会依赖这种行为。

标签: c++ stl set predicate


【解决方案1】:

你得到错误是因为 operator() 是一个成员函数,所以你使用的那个有两个参数,this 和 0xbb77。

您可以改用set::find

如果您想使用不同的类成员值进行搜索,您必须向ZipCode 提供三个构造函数,其中每个都采用与 operator() 重载之一相同的参数。然后添加一个operator==(const ZipCode& other)函数,去掉operator()s。

我会打出来,但在 iPad 上很难打出来

【讨论】:

    【解决方案2】:

    首先,将结构既作为信息存储,又作为具有三种不同用途的函子,是糟糕的设计。太纠结了。我差点以为std::set&lt;ZipCode, ZipCode&gt; 是非法的。

    其次,您的问题的干净解决方案应该是地图。 std::map&lt;int, std::array&lt;char, 4&gt;&gt;。 STL 通用算法对std::set(通常是红黑树)中的任何数据结构的优良属性一无所知,因此请改用map::find

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 2015-07-18
      • 1970-01-01
      相关资源
      最近更新 更多