【问题标题】:Providing less than operator for one element of a pair为一对中的一个元素提供小于运算符
【发布时间】:2010-02-24 19:35:05
【问题描述】:

修复以下代码最优雅的方法是什么:

#include <vector>
#include <map>
#include <set>
using namespace std;

typedef map< int, int > row_t;
typedef vector< row_t > board_t;
typedef row_t::iterator area_t;

bool operator< ( area_t const& a, area_t const& b ) {
    return( a->first < b->first );
};

int main( int argc, char* argv[] )
{
    int row_num;
    area_t it;

    set< pair< int, area_t > > queue;
    queue.insert( make_pair( row_num, it ) ); // does not compile
};

解决它的一种方法是将 less你不应该这样做。)

namespace std {
    bool operator< ( area_t const& a, area_t const& b ) {
        return( a->first < b->first );
    };
};

另一个明显的解决方案是定义小于 但我想避免这种情况并成为 只能为一个元素定义运算符 未定义的对。

【问题讨论】:

  • 这是一个有趣的名字,你的设置在那里;)
  • 名字里有什么?任何其他名字的玫瑰都会闻起来很香。

标签: c++ stl operators operator-keyword


【解决方案1】:

当您实现一个比较器来实现一些特定和/或相当奇特的比较方法时,最好使用命名函数或函数对象,而不是为此目的劫持operator &lt;。我想说比较std::pair 对象的自然方法是使用字典比较。由于您的比较不是按字典顺序进行的,因此接管 operator &lt; 可能不是一个好主意。更好地实现一个比较器类

typedef pair< int, area_t > Pair; // give it a more meaningful name

struct CompareFirstThroughSecond {
  bool operator ()(const Pair& p1, const Pair& p2) const { 
    if (p1.first != p2.first) return p1.first < p2.first;
    return p1.second->first < p2.second->first;
  }
};

并将其与您的容器一起使用

std::set< Pair, CompareFirstThroughSecond > queue;  

(我希望我从您的原始代码中正确解读了您的意图)。

您还可以将上述operator () 方法实现为模板方法,从而使其可用于所有基于std::pair 的类型,其中迭代器作为second 成员。不过,这可能没有意义,因为您的比较已经足够“异国情调”了。

【讨论】:

  • 您似乎错过了std::pair 已经实现了operator&lt;,并且 OP 想知道如何为第二个成员(迭代器)插入比较器。
  • @UncleBens:哦,明白了。你说的对。不过,我建议的应该可行。此外,尝试通过运算符重载为迭代器类型实现比较器是一项冒险的尝试,因为在一般情况下迭代器可能碰巧由内置类型实现(对于该类型,运算符重载是不可能的)。
  • @UncleBens - 这是一个很好的表达方式。我想为该对的第二个元素 plug-in 一个运算符。 @AndreyT - 我需要先比较这对的整数,然后 - 如果它们相等 - 继续比较 area_t 这对的成员。那行得通。但这正是我试图避免的解决方案——operator&lt; 已经为std::pair 和整数实现了。我不想重新发明轮子。 (此外,打字的次数非常多。)
  • @Koszalek Opalek:好的,但请记住,如果您的迭代器类型是内置类型,您的代码将无法编译,因为重载运算符是非法的内置类型。
  • @AndreyT:您似乎误解了他的意思,但我相应地更正了答案中的代码。
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
相关资源
最近更新 更多