std::set、multiset和unordered_set(hash_set)

中文标准库:multiset

一、构造

二、set在标准库中的算法

标准库algorithm

  • std::set_union 计算两个集合的并集

  • set_symmetric_difference 计算两个集合的对称差

  • std::set_intersection 计算两个集合的交集

  • std::set_difference 计算两个集合的差集 转载:set_difference的使用

三、修改元素

删除再重新插入

利用智能指针修改set元素

转载:set迭代器修改元素

std::set<int> iset;
std::set<int>::iterator it = iset.insert(4).first;
(*it)++; // error. 原因:std::set的迭代器不能修改对应的元素.

这是因为std::set的特点是:

  1. 对于插入、删除和查找操作,set保证其时间复杂度都是O(log n);

  2. set是一个有序的、可以前向和后向遍历的容器(双向迭代器);

  3. set是一个元素类型和比较函数可以配置的容器,但是一经配置,就不可更改;

  4. 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;
}
原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14743981.html