C++11新特性 —— std::vector::emplace_back()

vector::emplace_back - C++ Reference (cplusplus.com)

功能:在末端构建并插入元素

emplace_back 是 C++ 标准库中,特别是 <vector> 容器提供的一个非常有用的成员函数。它的主要用途是在向 vector 的末尾添加元素时,直接在容器的内存位置构造该元素,而不是先构造一个元素,然后复制或移动到 vector 中。这样做可以显著提高性能,特别是当元素是大型对象或需要复杂初始化时。

#include <iostream>
#include <vector>

int main ()
{
    vector<int> vec = {10,20,30};

    vec.emplace_back (100);
    vec.emplace_back (200);

    cout << "vec contains:";
    for (auto& x: vec)
        cout << ' ' << x;
    //vec contains: 10 20 30 100 200
    return 0;
}

在向量末尾插入一个新元素,就在其当前最后一个元素之后。这个新元素是使用 args 作为其构造函数的参数就地构造的,这有效地将容器大小增加了一个,会导致分配的存储空间在新的向量大小超过当前向量容量时自动重新分配。

通过调用 allotor_traits::construct 并转发 args 来就地构造元素。如果发生重新分配,则使用容器的分配器分配存储,这可能会在失败时抛出异常(对于默认分配器,如果分配请求不成功,则抛出 bad_alloc)。

emplace_back 函数的调用方式类似于 push_back,但它接受一个或多个参数,这些参数直接用于在 vector 的末尾构造新的元素。这些参数会传递给元素的构造函数。

#include <iostream>
#include <vector>  
#include <string>  
  
int main()
{  
    vector<string> vec;
    
    // 直接在 vector 的末尾构造一个 string 对象
    vec.emplace_back("Hello");

    // 构造一个包含 5 个 'a' 的 string 对象
    vec.emplace_back(5, 'a');

    return 0;  
}
push_back 和 emplace_back 的区别是什么?

如果要将一个临时变量 push 到容器的末尾,push_back() 需要先构造临时对象,再将这个对象拷贝到容器的末尾,而 emplace_back() 则直接在容器的末尾构造对象,这样就省去了拷贝的过程

与 push_back 的比较:

  • 性能:emplace_back 通常比 push_back 更高效,因为它避免了额外的复制或移动操作。然而,如果元素是一个小型对象或者已经是一个右值(临时对象),那么 push_back 和 emplace_back 之间的性能差异可能很小或不明显。
  • 语法:emplace_back 需要你提供直接用于元素构造的参数,而 push_back 需要一个完整的对象作为参数。
  • 灵活性:push_back 允许你传递任何可以隐式转换为 vector 中元素类型的对象,而 emplace_back 需要你精确地提供构造新元素所需的参数。

猜你喜欢

转载自blog.csdn.net/weixin_74531333/article/details/142968856