/**
set不支持随机访问,必须要使用迭代器去访问。
由于set放入一个元素就会调整这个元素的位置,把它放到合适的位置,所以set中只有一个insert插入操作
实现了红黑树的平衡二叉检索树的数据结构,故利于检索而不利于维护
结构体设置友元函数重载<,实现结构体的比较(c++结构体本身没有比较大小功能,但是可以设置运算符重载)
集合的算法algrithm(代码演示了union,这几个函数适合操作字符串):
std::set_intersection() :这个函数是求两个集合的交集。
std::set_union() :求两个集合的并集
std::set_difference():差集
std::set_symmetric_difference():得到的结果是 第一个迭代器相对于第二个的差集 并上第二个相对于第一个的差集
---------------------
*/
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
struct Student
{
int cord;
string name;
public:
Student() {}
Student(int c, string n):cord(c), name(n) {}
bool friend operator < (Student a, Student b) {
return a.cord > b.cord;
}
};
int main()
{
/*
set 自定义对象操作
*/
set<Student> s;//初始化
s.insert(Student(1,"a"));//插入
s.insert(Student(2,"b"));
set<Student> s2;
s2.insert(Student(1,"aa"));
s2.insert(Student(22,"bb"));
//合并:22 bb 2 b 1 aa
set_union(s.begin(),s.end(),s2.begin(),s2.end(),inserter(s2,s2.end()));
//遍历
set<Student>::iterator it;
for( it = s2.begin(); it != s2.end();it++)
cout<<it->cord<<" "<<it->name<< "\t";//输出
//查找
if(s.find(Student(2,"bb")) != s.end()) {
cout<<"\ns find stu(2) success\n";
} else {
cout<<"\ns find stu(2) failed\n";
}
//清除后查找
s.clear();
if(s.find(Student(2,"bb")) != s.end()) {
cout<<"\ns find stu(2) success\n";
} else {
cout<<"\ns find stu(2) failed\n";
}
/*
set int类型操作
*/
set<int> intS;
intS.insert(1);
intS.insert(3);
intS.insert(2);
//遍历
set<int>::iterator intIter;
for(intIter = intS.begin();intIter != intS.end();intIter++)
cout<<*intIter<<" ";//输出
//查找
if(intS.find(2) != intS.end()) {
cout<<"\ns find int(2) success\n";
} else {
cout<<"\ns find int(2) failed\n";
}
/*
set char类型操作
*/
set<char> charS;
charS.insert('a');
charS.insert('b');
//遍历
set<char>::iterator charIter;
for(charIter = charS.begin();charIter != charS.end();charIter++)
cout<<*charIter<<" ";//输出
//查找
if(intS.find('a') != intS.end()) {
cout<<"\ns find char(\'a\') success\n";
} else {
cout<<"\ns find char(\'a\') failed\n";
}
return 0;
}