3. 迭代器
set迭代器的使用与其他容器的迭代器一样
void Test2() { vector<int> v = {1,3,5,2,6,3,5,1}; set<int> s(v.begin(), v.end());//使用set存放之后可以去重 set<int>::iterator it1 = s.begin(); cout << "正向迭代器:"; while(it1 != s.end()) { cout <<*it1 << " "; ++it1; } cout << endl; set<int>::reverse_iterator it2 = s.rbegin(); cout << "反向迭代器:"; while (it2 != s.rend()) { cout << *it2 << " "; ++it2; } cout << endl; }
4.容量相关操作
函数原型 | 说明 |
bool empty() const; | 判断set是否为空,如果为空返回true,否则返回flase |
size_t size() const; | 返回容器的数据个数,类型为size_t(unsigned int) |
size_t max_size() const; | 返回容器中最多能够存放的数据个数 |
5.modify
1.insert
向set中插入一个对象,并且能够保持结构不变,依然符合平衡搜索树
这里注意一下:第一个插入返回的是一个pair类型的对象,其中pair的第一个成员是一个迭代器,其指向的是插入的元素在set中的位置,第二个成员是bool类型,如果成功插入了数据就返回true,若set中已经存在这个数据,就会插入失败,其中的值就是false。
所以这里insert能够做到两个功能:查找和插入。
2.erase
在set中删除一个数据,并且结构保持不变
void Test3() { vector<int> v = {1,3,5,2,6,3,5,1}; set<int> s(v.begin(), v.end());//使用set存放之后可以去重 cout << "before insert:"; auto it1 = s.begin(); while(it1 != s.end()) { cout <<*it1 << " "; ++it1; } cout << endl; //insert auto a1 = s.insert(4); auto a2 = s.insert(4); cout << "after insert:"; it1 = s.begin(); while(it1 != s.end()) { cout <<*it1 << " "; ++it1; } cout << endl; cout << "a1:" << *(a1.first) << ":" << a1.second << endl; cout << "a2:" << *(a2.first) << ":" << a2.second << endl; cout << "---------------------------" << endl; s.erase(4); cout << "after erase"; it1 = s.begin(); while(it1 != s.end()) { cout <<*it1 << " "; ++it1; } cout << endl; }
3.swap
交换两个set对象,效率比算法库里实现的高
4.clear
清除set对象中所有数据,但是不删除set对象
6.其他操作接口
1.find
查找set中某个元素,并返回迭代器,如果不存在,就返回end()。
2.lower_bound
以传入的值为下限,返回一个迭代器
3.upper_bound
以传入的值为上限,返回一个迭代器
void Test4() { set<int> s; for(int i = 1; i < 10; ++i) s.insert(10 * i); auto it = s.find(30); if(it != s.end()) s.erase(it); for(const auto& e : s) { cout << e << " "; } cout << endl; auto it1 = s.lower_bound(40); auto it2 = s.upper_bound(70);//注意,这里返回的是70的下一个位置 s.erase(it1,it2);//这里的删除的迭代器区间是前闭后开的 for(const auto& e : s) { cout << e << " "; } cout << endl; }
除了set之外,在set头文件中还包含了一个容器:multisetmultiset使用文档
multiset与set极其相似,唯一的不同点就是multiset支持在内部插入重复的数据。
void Test5() { vector<int> v = {1,3,5,2,6,3,5,1}; set<int> s(v.begin(), v.end()); multiset<int> ms(v.begin(), v.end()); cout << " set:"; for(const auto& e : s) { cout << e << " "; } cout << endl; cout << "multiset:"; for(const auto& e : ms) { cout << e << " "; } cout << endl; }
这里补充一个在set里面没有介绍的接口:count:计算val在multiset中的个数,也可以用来判断set中是否存在该元素。