一、构造
二、set在标准库中的算法
-
std::set_union 计算两个集合的并集
-
set_symmetric_difference 计算两个集合的对称差
-
std::set_intersection 计算两个集合的交集
-
std::set_difference 计算两个集合的差集 转载:set_difference的使用
三、修改元素
删除再重新插入
std::set<int> iset;
std::set<int>::iterator it = iset.insert(4).first;
(*it)++; // error. 原因:std::set的迭代器不能修改对应的元素.
这是因为std::set的特点是:
-
对于插入、删除和查找操作,set保证其时间复杂度都是O(log n);
-
set是一个有序的、可以前向和后向遍历的容器(双向迭代器);
-
set是一个元素类型和比较函数可以配置的容器,但是一经配置,就不可更改;
-
set的元素可以插入、删除,但是不可更改。
set在任何时刻都是一个有序的结构,而一旦破坏这个有序性,set可能表现出非预期的行为。为了保证set的概念完整性,C++STL厉行规定了3和4两个限制,在绝大部分情况下,这两个限制是合理的。
但是,当我在set里面存的是shared_ptr元素时, 根本无所谓有没有序. 我就是要通过迭代器获取元素的非const引用. 解决如下:
点击查看代码
#include <iostream>
#include <set>
template<class T>
inline T & GetStdSetElement(std::_Rb_tree_const_iterator<T> std_set_iterator)
{
return *(T *)&(*std_set_iterator);
}
int main()
{
using namespace std;
set<int> iset;
pair< set<int>::iterator, bool> res = iset.insert(4);
int & i = GetStdSetElement(res.first);
i++;
cout << *( iset.begin() ) << endl;
return 0;
}
四、添加元素
从vector添加元素
insert(vec.begin(),vec.end());
五、set元素设置为自定义数据结构
必须在类外重载小于(<)运算符
点击查看代码
#include<iostream>
#include<set>
struct Set
{
Set(int _x, int _y)
{
x = _x;
y = _y;
}
int x;
int y;
};
bool operator<(Set a, Set b)//对<运算符 重载
{
return a.x > b.x;
}
int main()
{
Set s1(2, 3);
Set s2(3, 4);
Set s3(4, 5);
Set s4(2, 3);
std::set<Set> x{ s1,s2,s3,s4 };
int tet = 0;
return 0;
}
六、访问set元素
set元素的访问必须使用迭代器,关于迭代器的使用
如果要访问第n个元素可以这样做:
auto it = set.begin();
std::advance(it, n); // n即为元素下标
auto ret = *it;
七、其他
#include <iostream>
#include <unordered_set>
#include <concurrent_unordered_set.h>
using namespace std;
int main()
{
unordered_set<int> myset{ 1,2,3,4,5,6,7 };
for (auto x : { 2,4,8 })
{
if (myset.contains(x))
cout << "found\t" << x;
}
return 0;
}