18.8.6 set和multiset的区别
- set不可以插入重复的数据,而multiset可以
- set插入数据时会返回结果,表示是否插入成功
- multiset不会检测数据,因而可以插入重复数据
我们想要接收插入时返回的结果,就要先知道返回值的类型。
翻阅insert的帮助文档:
single element pair<iterator, bool> insert( const value_type& Val );
单个元素成员函数 (1) 和 (2) 将返回 pair,如果完成插入,则其 bool 组件为 true;如果该集已经包含一个在排序中具有等效值的元素,则为 false。 返回值对的迭代器组件将指向新插入的元素(如果 bool 组件为 true)或现有元素(如果 bool 组件为 false)。
可以看到返回值为pair类型,且pair第一个成员为迭代器,第二个为bool。所以我们要创建一个pair变量去接收。
再翻阅pair的帮助文档:
template<class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
constexpr pair( );
constexpr pair(
const T1& Val1,
const T2& Val2
);
看到pair实际上是有两个成员的struct结构体模板,那么我们针对set<int>创建一个pair对象:
大概就是这样:
pair<set<int>::iterator, bool> pir;
有了上面的基本知识,来看本节示例:
#include <iostream>
#include <set>
using namespace std;
void test1()
{
set<int>s;
pair<set<int>::iterator, bool> ret = s.insert(10);
if (ret.second)
{
cout << "第一次插入成功" << endl;
}
else
{
cout << "第一次插入失败" << endl;
}
ret = s.insert(10);
if (ret.second)
{
cout << "第二次插入成功" << endl;
}
else
{
cout << "第二次插入失败" << endl;
}
multiset<int>ms;
ms.insert(10);
ms.insert(10);
ms.insert(10);
ms.insert(10);
for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++)
{
cout << *it << '\t';
}
cout << endl;
}
int main()
{
test1();
}
运行结果: