出现此错误的原因分析:
当我们用set插入自定义类型的时候,由于我们没有告诉编译器比较规则,所以编译器不知道该怎么将我们插入的自定义进行排序!
struct CustomType
{
int m_id;
std::string m_name;
}
解决办法:
使用全局函数或成员函数重载‘<’
#include <string>
#include <set>
using namespace std;
struct Student
{
int m_id;
string m_name;
Student(int id, string name) :m_id(id), m_name(name)
{
}
//成员函数的写法
//bool operator<(const Student& other) const
//{
// return m_id < other.m_id ? true : (m_id > other.m_id ? false : (m_name < other.m_name ? true : false));
//}
};
//全局函数的写法
//排序规则为:m_id从小到大,如果相同则名字从小到大
bool operator<(const Student& m1, const Student& m2)
{
return m1.m_id < m2.m_id ? true : (m1.m_id > m2.m_id ? false : (m1.m_name < m2.m_name ? true : false));
}
int main()
{
Student one(1, "xiaoming");
Student two(2, "xiaohong");
Student two_copy(2, "xiaohong");
set<Student> se;
se.insert(one);
se.insert(two);
se.insert(two_copy); //set容器不会插入相同值!
return 0;
}
注意事项
- operator < 作为成员函数是得声明为const函数,表示不能修改类对象的成员变量,保证被比较的两个对象内容不被修改。
- operator< 作为独立函数声明时需要将两个对象都声明为const类型。
- 要注意重载 < 符号的时候,在判断大小的地方不能加入 = ,即只能 > 或 < ,不能 >= 和 <= ,因为当插入的是两个相同值,会进入一个死循环!