c++ set重载'

C++语言 码拜 9年前 (2016-04-17) 1892次浏览
#include<cstdio>
#include<set>
using namespace std;
class A
{
public:
	int a,b,c;
	friend bool operator <(A a,A b)
	{
		return a.a<b.a;
	}
};
int main()
{
	A a1,a2;
	a1.a=1;a1.b=2;a1.c=3;
	a2.a=1;a2.b=3;a2.c=4;
	set <A> s;
	s.insert(a1);
	s.insert(a2);
	printf("%d\n",s.size());//输出1
	return 0;
}

为什么会输出1,原因是重载小于号的时候只用了a吗,假如a,b,c都用了就是2.

解决方案

30

原因是你a1与a2对象中a的值是相等的,根据你重载的小于号得出a1不小于a2,a2也不小于a1,故a1等于a2,那么set中是不会插入相等的多个元素的

10

set 是不重复的有序集
operator < 用来排序的
相同的数据(这是根据 operator< 确定的),只能插入一个。

15

#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
class A {
public:
    A(int arg_a, int arg_b, int arg_c) :
        a_(arg_a), b_(arg_b), c_(arg_c) {}
private:
    int a_, b_, c_;
};
inline bool operator <(const A & lhs, const A & rhs) {
    return memcmp(&lhs, &rhs, sizeof(lhs)) < 0;
}
int main() {
    A a1(1, 2, 3), a2(1, 3, 4);
    set<A> s;
    s.insert(a1);
    s.insert(a2);
    printf("%u\n", s.size());//输出2
    return 0;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c++ set重载'
喜欢 (0)
[1034331897@qq.com]
分享 (0)