c/c++ set,map的用法及区别

STL总共实现了两种不同结构的管理式容器:树型结构哈希结构树型结构的关联式容器主要有四种:set,map,multiset,multimap。下面介绍一下主要介绍set和nultiset的用法,及set与map的区别,具体map的用法示例见链接。

1.set

set里面每个元素只存有一个key值,它支持高效的关键字查询操作,比如检查一个关键字是否在set中。如果这个key值之前存在的话就不插入(有序无重复)。

简单使用如下:

插入:

set<int> s;
	s.insert(2);
	s.insert(1);
	s.insert(4);
	s.insert(5);
	s.insert(3);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

插入如上数据之后,打印出来的值为1 2 3 4 5。set容器自动对以上数据进行了排序,并且实现了去重。但是不能对set里的值进行修改。

查找:

//时间复杂度:O(logN)----底层是搜索树
set<int>::iterator pos = s.find(3);
//时间复杂度:O(N)----需要遍历一遍(不建议使用)
//set::iterator pos = find(s.begin(), s.end(), 3);
if (pos != s.end())
{
	cout << "找到了" << endl;
}

set容器中的find查找效率高,因为底层是一个二叉搜索树,比要查找的值小就去左子树查找,反之则去右子树查找。

删除:

//s.erase(3);
s.erase(pos);//找到了我就删,没找到要删的话会报错
for (auto e : s)
{
	cout << e << " ";
}
cout << endl;


采用s.erase(3);这种操作如果没有3并不会报错,如果有3则会删除这个结点。
找到pos位置,采用s.erase(pos);这种操作如果没有3则会报错,如果有3则会删除这个结点。

交换:

set<int> ss;
ss.insert(6);
ss.insert(9);
ss.insert(8);
ss.insert(7);
ss.insert(10);

ss.swap(s);//交换根节点的指针,效率高
for (auto e : s)
{
	cout << e << " ";
}
cout << endl;


两个set的交换的其实是交换结点的指针,效率高。

清空:

s.clear();//清掉所有数据
for (auto e : s)
{
	cout << e << " ";
}
cout << endl;


遍历:

//新式for循环
for (auto e : s)
{
	cout << e << " ";
}
cout << endl;

//迭代器遍历
set<int>::iterator sit = s.begin();
while (sit != s.end())
{
	cout << *sit << " ";
	sit++;
}
cout << endl;


2. multiset

其实整体的接口和set都相同,但是multiset可以插入key相同的值。(允许重复

multiset<int> ms;
ms.insert(2);
ms.insert(1);
ms.insert(4);
ms.insert(5);
ms.insert(3);
ms.insert(5);
ms.insert(5);
ms.insert(5);
ms.insert(5);
ms.insert(5);

for (auto e : ms)//可以重复插入相同key值
{
	cout << e << " ";
}
cout << endl;

auto pos = ms.find(5);
if (pos != ms.end())
{
	cout << "找到了" << endl;//找到的是中序的第一个5
	while (*pos == 5)//往后继续找可以找到后面所有的5
	{
		cout << *pos << endl;
		++pos;
		if (pos == ms.end())//pos指向最后一个的下一个
			break;
	}
}

--pos;//倒数第一个5
ms.erase(pos);

for (auto e : ms)//可以重复插入相同key值
{
	cout << e << " ";
}
cout << endl;

c/c++ set,map的用法及区别_第1张图片
multiset允许key的冗余,如果用find查找key值时,找到的是中序遍历第一个,因此不断遍历下午可以找到这个multiset里所有的key值。

multiset和set一样不能够对数据进行修改。

set和map特性和区别

set是一种关联式容器,其特性如下:

  1. set以RBTree作为底层容器
  2. 所得元素的只有key没有value,value就是key
  3. 不允许出现键值重复
  4. 所有的元素都会被自动排序
  5. 不能通过迭代器来改变set的值,因为set的值就是键

map和set一样是关联式容器,它们的底层容器都是红黑树,区别就在于map的值不作为键,键和值是分开的。它的特性如下:

  1. map以RBTree作为底层容器
  2. 所有元素都是键+值存在
  3. 不允许键重复
  4. 所有元素是通过键进行自动排序的
  5. map的键是不能修改的,但是其键对应的值是可以修改的

转载自: https://blog.csdn.net/ETalien_/article/details/89439892

你可能感兴趣的:(【C/C++】,c++,容器,set,map)