C++ STL set insert()方法详解
为满足不同场景的需要,C++ 11 标准的 set 类模板中提供了多种不同语法格式的 insert() 成员方法,它们各自的功能和用法如下所示。
1) 只要给定目标元素的值,insert() 方法即可将该元素添加到 set 容器中,其语法格式如下:
//普通引用方式传参
pair<iterator,bool> insert (const value_type& val);
//右值引用方式传参
pair<iterator,bool> insert (value_type&& val);
可以看到,以上 2 种语法格式的 insert() 方法,返回的都是 pair 类型的值,其包含 2 个数据,一个迭代器和一个 bool 值:以上 2 种格式的区别仅在于传递参数的方式不同,即第一种采用普通引用的方式传参,而第二种采用右值引用的方式传参。右值引用为 C++ 11 新添加的一种引用方式,可阅读《C++ 右值引用》一文做详细了解。
- 当向 set 容器添加元素成功时,该迭代器指向 set 容器新添加的元素,bool 类型的值为 true;
- 如果添加失败,即证明原 set 容器中已存有相同的元素,此时返回的迭代器就指向容器中相同的此元素,同时 bool 类型的值为 false。
举个例子:
#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 = "https://www.xinbaoku.com/stl/"; retpair = myset.insert(str); cout << "iter->" << *(retpair.first) << " " << "bool = " << retpair.second << endl; //采用右值引用传值方式 retpair = myset.insert("https://www.xinbaoku.com/python/"); cout << "iter->" << *(retpair.first) << " " << "bool = " << retpair.second << endl; return 0; }程序执行结果为:
iter->https://www.xinbaoku.com/stl/ bool = 1
iter->https://www.xinbaoku.com/python/ bool = 1
2) insert() 还可以指定将新元素插入到 set 容器中的具体位置,其语法格式如下:
//以普通引用的方式传递 val 值
iterator insert (const_iterator position, const value_type& val);
//以右值引用的方式传递 val 值
iterator insert (const_iterator position, value_type&& val);
- 当向 set 容器添加元素成功时,该迭代器指向容器中新添加的元素;
- 当添加失败时,证明原 set 容器中已有相同的元素,该迭代器就指向 set 容器中相同的这个元素。
举个例子:
#include <iostream> #include <set> #include <string> using namespace std; int main() { //创建并初始化set容器 std::set<std::string> myset; //准备接受 insert() 的返回值 set<string>::iterator iter; //采用普通引用传值方式 string str = "https://www.xinbaoku.com/stl/"; iter = myset.insert(myset.begin(),str); cout << "myset size =" << myset.size() << endl; //采用右值引用传值方式 iter = myset.insert(myset.end(),"https://www.xinbaoku.com/python/"); cout << "myset size =" << myset.size() << endl; return 0; }程序执行结果为:
myset size =1
myset size =2
注意,使用 insert() 方法将目标元素插入到 set 容器指定位置后,如果该元素破坏了容器内部的有序状态,set 容器还会自行对新元素的位置做进一步调整。也就是说,insert() 方法中指定新元素插入的位置,并不一定就是该元素最终所处的位置。
3) insert() 方法支持向当前 set 容器中插入其它 set 容器指定区域内的所有元素,只要这 2 个 set 容器存储的元素类型相同即可。
insert() 方法的语法格式如下:
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
举个例子:
#include <iostream> #include <set> #include <string> using namespace std; int main() { //创建并初始化set容器 std::set<std::string> myset{ "https://www.xinbaoku.com/stl/", "https://www.xinbaoku.com/python/", "https://www.xinbaoku.com/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; }程序执行结果为:
https://www.xinbaoku.com/python/
https://www.xinbaoku.com/stl/
4) 采用如下格式的 insert() 方法,可实现一次向 set 容器中添加多个元素:
void insert ( {E1, E2,...,En} );
其中,Ei 表示新添加的元素。举个例子:
#include <iostream> #include <set> #include <string> using namespace std; int main() { //创建并初始化set容器 std::set<std::string> myset; //向 myset 中添加多个元素 myset.insert({ "https://www.xinbaoku.com/stl/", "https://www.xinbaoku.com/python/", "https://www.xinbaoku.com/java/" }); for (auto iter = myset.begin(); iter != myset.end(); ++iter) { cout << *iter << endl; } return 0; }程序执行结果为:
https://www.xinbaoku.com/java/
https://www.xinbaoku.com/python/
https://www.xinbaoku.com/stl/
有关 set 类模板中 implace() 和 implace_hint() 方法的用法,后续章节会做详细介绍。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算