目錄
set是一種關聯式容器,特性如下:
- set以RBTree作爲底層容器
- 不允許出現鍵值重複
- set容器只提供 insert()方法,因爲它自動進行排序
- 不能通過迭代器來改變set的值,
可以通過set是迭代器改變元素的值嗎??
不可以改變,如果非要改變,刪除後再添加。
如果set中允許修改鍵值的話,那麼首先需要刪除該鍵,然後調節平衡,在插入修改後的鍵值,再調節平衡,這樣嚴重破壞了set的結構,導致iterator失效,不知道應該指向之前的位置,還是指向改變後的位置。STL中將set的迭代器設置成const,不允許修改迭代器的值。
set 構造、賦值、插入、刪除
- set構造函數
set<T>st; //set默認構造函數
set(const set &st);//拷貝構造函數
- set賦值操作
set& operator=(const set &st);// 等號運算符的重載
swap(st);// 交換兩個容器
- set大小操作
size();//返回容器中元素的數目
empty();//判斷容器是否爲空
- ser插入和刪除操作
insert(elem);//在容器中插入元素
clear();//清除所有元素
erase(pos);//刪除迭代器所指的元素,返回下一個元素的迭代器
erase(beg,end);//刪除區間所有元素,返回下一個元素的迭代器
erase(elem);/刪除容器中值爲 elem的元素
操作代碼:
#include <algorithm>
#include <iostream>
#include<set>
using namespace std;
void Print(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it <<" ";
}
cout << endl;
}
void test01()
{
//set容器初始化
set<int> s1; //自動進行排序,默認從小到大
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
Print(s1);//1 2 4 5 7
set<int> s2;
s2 = s1;//賦值
//刪除元素
s1.erase(s1.begin());//erase()參數爲 迭代器
Print(s1); //2 4 5 7
s1.erase(7);
Print(s1);// 2 4 5
}
int main()
{
test01();
return 0;
}
打印結果:
set 查找操作
- find(key):查找鍵key是否存在,若存在,返回該鍵的元素的迭代器,若不存在,返回set.end();
- lower_bound(keyElem):返回第一個key>=keyElem元素的迭代器。
- upper_bound(keyElem):返回第一個key>keyElem元素的迭代器。
- equal_range(keyElem):返回容器中ley與keyElemx相等的上下限的兩個迭代器,即equal_range()將lower_bound()和upper_bound()的 返回值做個一個pair返回。
操作代碼:
#include <algorithm>
#include <iostream>
#include<set>
using namespace std;
//set的查找
void test02()
{
set<int> s1;
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
set<int>::iterator ret=s1.find(14);
if (ret == s1.end())
{
cout << "沒有找到!" << endl;
}
else
{
cout << "ret:" << *ret << endl;
}
ret=s1.lower_bound(2);//找到第一個>=
if (ret == s1.end())
{
cout << "沒有找到!" << endl;
}
else
{
cout << "ret:" << *ret << endl;
}
ret = s1.upper_bound(2);//找到第一個>
if (ret == s1.end())
{
cout << "沒有找到!" << endl;
}
else
{
cout << "ret:" << *ret << endl;
}
//equal_range返回lower_bound和upper_bound
pair<set<int>::const_iterator, set<int>::const_iterator> myret=s1.equal_range(2);
if (myret.first == s1.end())
{
cout << "沒有找到!" << endl;
}
else
{
cout << "myret:" << *(myret.first) << endl;
}
if (myret.second == s1.end())
{
cout << "沒有找到!" << endl;
}
else
{
cout << "myret:" << *(myret.second) << endl;
}
}
int main()
{
//test01();
test02();
return 0;
}
打印結果: