gpt4 book ai didi

c++ - 为一对中的一个元素提供小于运算符

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:03 32 4
gpt4 key购买 nike

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

#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(我知道,你不应该这样做。)

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

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

最佳答案

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

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成员。不过,这可能没有多大意义,因为您的比较已经足够“异国情调”了。

关于c++ - 为一对中的一个元素提供小于运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2328889/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com