gpt4 book ai didi

C++ 设置任意比较器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:12 27 4
gpt4 key购买 nike

我有以下C++代码

#include <set>
#include <string>
#include <iostream>
using namespace std;

class Pair {
public:
string lhs;
string rhs;
Pair();
Pair( string l, string r ) {
lhs=l;
rhs=r;
};
};

struct compare {
bool operator()(const Pair& a, const Pair& b) const{
if ( ( a.lhs == b.lhs && a.rhs == b.rhs ) || ( a.lhs == b.rhs && a.rhs == b.lhs ) ) {
cout << "MATCH" << endl;
}
return ( a.lhs == b.lhs && a.rhs == b.rhs ) || ( a.lhs == b.rhs && a.rhs == b.lhs );
}
};

int main () {
set<Pair, compare > s;
Pair p( string("Hello"), string("World") );
s.insert(p);
cout << s.size() << "\n";
Pair q( string("World"), string("Hello") );
s.insert(q);
cout << s.size() << "\n";
compare cmp;
cout << cmp( p, q );

return 0;
}

调用编译后的代码给出:

1
MATCH
MATCH
2
MATCH

不知何故集合 s 以两个对 p 和 q 结束,尽管比较器将它们识别为相同。为什么?

任何帮助将不胜感激!

更新:

非常感谢您的出色回答以及您友好而专业的帮助。您可能已经猜到了,我是 C++ 的新手。

无论如何,我想知道 Antoine 的回答是否可以用 lambda 表达式来完成?

类似于:

std::set< …, [](){ my_comparator_code_here } > s;

????

最佳答案

std::set 的比较运算符(这是一个有序的容器)需要确定一个严格的弱顺序而不是您希望的任何任意测试。通常正确实现 operator<完成工作。

如果您的比较运算符不提供严格的弱排序(正如您的那样),则行为将是未定义的。没有办法解决 C++ 标准的这一要求。

请注意,在某些需要进行相等比较的情况下,必须使用 operator<两次进行比较。

您是否也考虑过使用 std::pair<std::string, std::string>而不是自己滚动?

我已经把你的问题重读了五遍了,我开始怀疑你想要的是不是 set哪个字符串在 first 中和 second就比较而言并不重要。在那种情况下,@Antoine 似乎对您来说是正确的解决方案。

关于C++ 设置任意比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20803383/

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