C++11 之 容器 insert 成员的返回类型、容器的 emplace成员
程序员文章站
2022-03-21 15:17:10
...
使用 insert 的返回值
通过使用 insert 的返回值,可以在容器中一个特定位置反复插入元素:
list<string> lst;
auto iter = lst.begin();
string word;
while(cin >> word)
iter = lst.insert(iter, word);
iter = lst.insert(iter, word); 这条语句等价于:
lst.push_front(word);
理解这个循环是如何工作的非常重要,特别是理解这个循环为什么等价于调用 push_front 尤其重要。
每次插入一个新元素之后,insert 返回的迭代器恰好指向这个新元素。我们将此迭代器赋予 iter 并重复循环,读取下一个单词。
因此,每步循环将一个元素插入到list 首元素之前的位置。
使用emplace 操作
新标准引入了三个新成员——emplace_front
、emplace
和 emplace_back
,这些操作构造而不是拷贝元素
。这些操作分别对应push_front、insert 和 push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。
当调用push 和insert 成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器
中。而当我们调用一个emplace 成员函数时,则是将参数传递给元素类型的构造函数。emplace 成员使用这些参数在容器管理的内存空间中直接构造元素
。
例如, c保存 Sales_data拥有三个构造参数的元素:
c.emplace_back("5201314", 520, 13.14); // 使用三个参数的 Sales_data构造函数
c.push_back("5201314", 520, 13.14); // 错误:没有接受三个参数的push_back 版本
c.push_back(Sales_data("5201314", 520, 13.14)); // 正确:创建一个临时的Sales_data对象传递给push_back
emplace 函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配:
// iter 指向 c中一个元素,其中保存了 Sales_data元素
c.emplace_back(); // 使用Sales_data 的默认构造函数
c.emplace(iter, "5201314); // 使用 Sales_data(string)
c.emplace("5201314", 520, 13.14); // 使用 Sales_data的接受三个参数的构造函数
emplace 函数在容器中直接构造元素。传递给emplace 函数的参数必须与元素类型的构造函数相匹配。
下面我们来看一下 emplace_front 的一个完整示例:
#include <iostream>
#include <string>
#include <list>
class Ob
{
private:
int a
int b;
public:
Ob(int m,int n) : a(m), b(n) {}
friend std::ostream& operator<<(std::ostream& os, Ob& ob){
std::cout<< ob.a << ' ' << ob.b << '\n';
return os;
}
};
int main()
{
std::list<Ob> arr;
arr.emplace_front(20, 30);
std::cout << *arr.begin();
return 0;
}
上一篇: emplace与insert的区别
下一篇: json日期格式转换成日期字符串