欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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_frontemplaceemplace_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;
}

相关标签: C++