在C ++ 17中std :: vector :: emplace_back返回值的用例是什么?

时间:2018-11-10 14:47:57

标签: c++ c++17 stdvector emplace

我在cppreference.com中读到,新的(自C ++ 17起)std::vector::emplace_back具有对插入元素的引用返回值。

  

返回值

     
      
  • (无)(直到C ++ 17)
  •   
  • 对插入元素的引用。 (自C ++ 17起)
  •   

我在想,将元素插入向量时,为什么我们需要对其进行引用?怎么可能有用,或者这个新回报的用例是什么?

这是我编写以查看的示例代码,该功能。

#include <vector>

int main()
{
    std::vector<int> myVec;
    for(int i = 0; i < 3; ++i)
    {
        int& newElement = myVec.emplace_back(i);
        ^^^^^^^ => why standard should expose the element after inserting.
    }
}

2 个答案:

答案 0 :(得分:7)

通过P0084进行更改。作者给出的动机是

  

我经常发现自己想使用emplace_frontemplace_back创建容器的元素,然后访问该元素,以进一步修改它,或者只是使用它。所以我发现自己在写这样的代码:

my_container.emplace_back(...);
my_container.back().do_something(...);
     

或者也许:

my_container.emplace_back(...);
do_something_else(my_container.back());
     

一个常见的特定情况是,在我拥有所有对象之前,我需要构造一个对象   使其处于最终状态所需的信息,例如当我从文件中读取信息时:

my_container.emplace_back(); // Default construct.
my_container.back().read(file_stream); // Read the object.
     

这种情况经常发生,以至于我倾向于编写一些小的模板,以调用某个版本的emplace并返回,这对我来说似乎是不必要的。我相信emplace_frontemplace_back函数应该返回对新创建元素的非常量引用,以符合当前标准库在实用时返回有用信息的趋势。最初的emplace建议(我个人)对此并不负责。

答案 1 :(得分:4)

std::cout << vec.emplace_back(7);

这只是方便,所以您可以在表达式中做很多事情。

vec.emplace_back().reg();

它所做的任何事情都可以复制

(void(vec.emplace_back()), vec.back()).reg();

在C ++ 17之前的版本中(此处避免过时的偏执狂)

创建对象并立即使用它是一种常见的模式;返回值使其变得更容易。