本章主要内容
想要深入了解的可以查看:set 文档
这里我简单介绍一下:
注意:
1.iterator insert(iterator position,const value_type&x)
功能:在set相对的position位置插入x,实际插入了
在插入的同时判断元素在不在set中,如果已经存在则不再插入,故可实现去重。
2. size_type erase(const key_type&x)
功能:删除set中值为x的元素,返回删除元素的个数。
因为set主动完成了去重工作,所以set返回的结果只有1和0,而multiset 就不一定。
3. void clean()
功能:清空set 中的元素。
4. iterator find (const key_type&x)const
功能:返回set中值为x的元素的位置,时间复杂度为O(logN)
这里也可用std::find实现查找,不过效率太低,事件复杂度为O(N)
注意: 因为set通过红黑树实现,而std需要从头开始遍历。
==5. size_type count(const key_type&x)const ==
功能:返回set中值为x的元素的个数。
这里set返回的结果只有1和0,而multiset 就不一定。
#include
#include
#include
using namespace std;
void TestSet()
{
// 用数组array中的元素构造set
int array[] = { 1, 3, 5, 7, 9, 2, 5, 5, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
set s(array, array + sizeof(array) / sizeof(0));
cout << s.size() << endl;
// 正向打印set中的元素,从打印结果中可以看出:set可去重
for (auto& e : s)
cout << e << " ";
cout << endl;
//使用迭代器打印set中的元素
s.insert(11);
s.insert(21);
set::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
++it;
}
cout << endl;
auto it1 = find(s.begin(), s.end(), 4); // O(N)
auto it2 = s.find(7); // O(logN)
if (it2 != s.end())
{
s.erase(it2);
}
cout << s.erase(5) << endl; //删除了set中仅有的1个,故输出1
cout << s.erase(5) << endl; //set中已经没有5,故输出0
//s.clear(); //清空set中的元素
cout << s.count(3) << endl; //返回值是1或0
for (auto e : s)
{
cout << e << " ";
}
cout << endl;
}
int main()
{
TestSet();
return 0;
}
想要深入了解的伙伴可以查看:multiset 文档
这里我简单介绍一下:
注意:
void TestMultiset() {
int array[] = { 2, 1, 3, 9, 6, 0, 5, 8, 4, 7 };
// 注意:multiset在底层实际存储的是的键值对
multiset s(array, array + sizeof(array) / sizeof(array[0]));
for (auto& e : s)
cout << e << " ";
cout << endl;
// 测试multiset中是否可以存储值相同的元素
s.insert(5);
cout << s.count(5) << endl; //此时结果为2,说明有重复
// 删除所有值为5的元素
cout<
联系:
区别:
4. map 中不允许key重复,而multimap 中允许key 重复。
前者更适合统计key的个数,后者更适合对个数进行排序。
6. map中可以通过key快速查找value,而multimap 不可以。
因此multimap 中也没有像map一样可提供修改value的 [] 操作符。
联系:
区别:
我在上篇博客中讲到另外两个关联式容器:
STL进阶-- 树形结构的关联式容器(map和multimap)