C++学习-STL-容器--SET保存重复值
记录一下最近学习set时遇到的一些问题。通常:1、set中的元素都是排好序的2、set集合中没有重复的元素当我们用set来保存自定义类对象的时候,我们需要规定比较规则,就是重载less<>(),因为set要排序,排序又要用到比较。例子:class Test2 {public:Test2(int n):num(n) {};~Test2...
·
记录一下最近学习set时遇到的一些问题。
通常:
1、set中的元素都是排好序的
2、set集合中没有重复的元素
当我们用set来保存自定义类对象的时候,我们需要规定比较规则,就是重载less<>(),因为set要排序,排序又要用到比较。
例子:
class Test2 {
public:
Test2(int n):num(n) {};
~Test2() {};
public:
int num;
string name;
};
template<>
struct std::less<Test2>
{
bool operator()(const Test2 t1, const Test2 t2) const
{
return t1.num < t2.num;
}
};
int main(){
set<Test2> test2_set2{ Test2(2), Test2(9), Test2(9), Test2(23), Test2(23), Test2(9), Test2(9), Test2(23), Test2(23) };
for (auto iter : test2_set2) { cout << iter.num<<" "; }cout << endl;
system("pause");
return 0;
}
输出:
这样和平时的set无异。
但是我往set里装对象指针的时候就不一样了:
int main(){
set<Test2*> test2_set{ new Test2(2),new Test2(9),new Test2(9),new Test2(23),new Test2(23),new Test2(9),new Test2(9),new Test2(23),new Test2(23) };
for (auto iter : test2_set) { cout << iter->num << " "; }cout << endl;
system("pause");
return 0;
}
输出:
对于这个set值重复的原因应该是set在排序时调用less<>()函数没有对应指针的参数,每个指针的位置都不一样,结果就全部都存进set了。
加上:
template<>
struct std::less<Test2*>
{
bool operator()(const Test2* t1, const Test2* t2) const
{
return t1->num < t2->num;
}
};
就可以了。
更多推荐
已为社区贡献1条内容
所有评论(0)