通过前面的学习,我们已经学会如何创建一个 set 容器。在此基础上,如果想向 set 容器中继续添加元素,可以借助 set 类模板提供的 insert() 方法。
为满足不同场景的需要,C++ 11 标准的 set 类模板中提供了多种不同语法格式的 insert() 成员方法,它们各自的功能和用法如下所示。
1) 只要给定目标元素的值,insert() 方法即可将该元素添加到 set 容器中,其语法格式如下:
其中,val 表示要添加的新元素,该方法的返回值为 pair 类型。
以上 2 种格式的区别仅在于传递参数的方式不同,即第一种采用普通引用的方式传参,而第二种采用右值引用的方式传参。右值引用为 C++ 11 新添加的一种引用方式,可阅读《C++ 右值引用》一文做详细了解。
可以看到,以上 2 种语法格式的 insert() 方法,返回的都是 pair 类型的值,其包含 2 个数据,一个迭代器和一个 bool 值:
举个例子:
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
//创建并初始化set容器
std::set<std::string> myset;
//准备接受 insert() 的返回值
pair<set<string>::iterator, bool> retpair;
//采用普通引用传值方式
string str = "http://www.cdsy.xyz/computer/programme/stl/";
retpair = myset.insert(str);
cout << "iter->" << *(retpair.first) << " " << "bool = " << retpair.second << endl;
//采用右值引用传值方式
retpair = myset.insert("http://www.cdsy.xyz/computer/programme/Python/");
cout << "iter->" << *(retpair.first) << " " << "bool = " << retpair.second << endl;
return 0;
}
程序执行结果为:
通过观察输出结果不难看出,程序中两次借助 insert() 方法向 set 容器中添加元素,都成功了。
2) insert() 还可以指定将新元素插入到 set 容器中的具体位置,其语法格式如下:
以上 2 种语法格式中,insert() 函数的返回值为迭代器:
举个例子:
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
//创建并初始化set容器
std::set<std::string> myset;
//准备接受 insert() 的返回值
set<string>::iterator iter;
//采用普通引用传值方式
string str = "http://www.cdsy.xyz/computer/programme/stl/";
iter = myset.insert(myset.begin(),str);
cout << "myset size =" << myset.size() << endl;
//采用右值引用传值方式
iter = myset.insert(myset.end(),"http://www.cdsy.xyz/computer/programme/Python/");
cout << "myset size =" << myset.size() << endl;
return 0;
}
程序执行结果为:
注意,使用 insert() 方法将目标元素插入到 set 容器指定位置后,如果该元素破坏了容器内部的有序状态,set 容器还会自行对新元素的位置做进一步调整。也就是说,insert() 方法中指定新元素插入的位置,并不一定就是该元素最终所处的位置。
3) insert() 方法支持向当前 set 容器中插入其它 set 容器指定区域内的所有元素,只要这 2 个 set 容器存储的元素类型相同即可。
insert() 方法的语法格式如下:
其中 first 和 last 都是迭代器,它们的组合 [first,last) 可以表示另一 set 容器中的一块区域,该区域包括 first 迭代器指向的元素,但不包含 last 迭代器指向的元素。
举个例子:
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
//创建并初始化set容器
std::set<std::string> myset{ "http://www.cdsy.xyz/computer/programme/stl/",
"http://www.cdsy.xyz/computer/programme/Python/",
"http://www.cdsy.xyz/computer/programme/java/" };
//创建一个同类型的空 set 容器
std::set<std::string> otherset;
//利用 myset 初始化 otherset
otherset.insert(++myset.begin(), myset.end());
//输出 otherset 容器中的元素
for (auto iter = otherset.begin(); iter != otherset.end(); ++iter) {
cout << *iter << endl;
}
return 0;
}
程序执行结果为:
注意,程序第 15 行在初始化 otherset 容器时,选取的是 myset 容器中从第 2 个元素开始(包括此元素)直到容器末尾范围内的所有元素,所以程序输出结果中只有 2 个字符串。
4) 采用如下格式的 insert() 方法,可实现一次向 set 容器中添加多个元素:
其中,Ei 表示新添加的元素。
举个例子:
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
//创建并初始化set容器
std::set<std::string> myset;
//向 myset 中添加多个元素
myset.insert({ "http://www.cdsy.xyz/computer/programme/stl/",
"http://www.cdsy.xyz/computer/programme/Python/",
"http://www.cdsy.xyz/computer/programme/java/" });
for (auto iter = myset.begin(); iter != myset.end(); ++iter) {
cout << *iter << endl;
}
return 0;
}
程序执行结果为:
以上的讲解,即为 set 类模板中 insert() 成员方法的全部用法。指的一提的是,C++ 11 标准的 set 类模板中,还提供有另外 2 个成员方法,分别为 implace() 和 implace_hint() 方法,借助它们不但能实现向 set 容器添加新元素的功能,其实现效率也比 insert() 成员方法更高。
有关 set 类模板中 implace() 和 implace_hint() 方法的用法,后续章节会做详细介绍。