繁体   English   中英

vector.emplace_back()和vector.push_back()做同样的事情吗?

[英]Do vector.emplace_back() and vector.push_back() do the same thing?

所以我试图在我的向量背面添加整数,并错误地认为push_back()将新数据添加到向量的前面(aka vector [0])。 我在Xcode中做了一个测试,并对emplace_back()测试了push_back() emplace_back()并获得了相同的结果。 我认为他们是不同的,但这让我觉得他们可能会做同样的事情。 如果是这样,为什么矢量有不同的方法?

这是我的代码,以防我正在做的事情:

#include <vector>
#include <iostream> 

using namespace std ;

int main(int argc, const char * argv[])
{
    // for push_back
    vector<int> push;
    push.push_back(1);
    push.push_back(2);
    push.push_back(3);
    push.push_back(4);
    push.push_back(5);
    push.push_back(6);
    //display push_back
    for (int i = 0; i < push.size(); i++) {
        cout << "push[" << i  << "]: " << push[i] << endl;
    }
    // distance between the two funcitons
    cout << endl << endl;

    vector<int> emplace;
    emplace.emplace_back(1);
    emplace.emplace_back(2);
    emplace.emplace_back(3);
    emplace.emplace_back(4);
    emplace.emplace_back(5);
    emplace.emplace_back(6);

    //display emplace_back
    for (int i = 0; i < emplace.size(); i++) {
        cout << "emplace[" << i  << "]: " << emplace[i] << endl;
    }
        return 0;
}

回报是:

push[0]: 1
push[1]: 2
push[2]: 3
push[3]: 4
push[4]: 5
push[5]: 6


emplace[0]: 1
emplace[1]: 2
emplace[2]: 3
emplace[3]: 4
emplace[4]: 5
emplace[5]: 6

我知道这是一个非常简单的问题,但我只是想确保我没有做一些愚蠢的错误并且误解了矢量类的能力。

区别在于emplace_back将构造对象而不是复制或移动, std :: vector :: emplace_back上的cppreference部分说:

通常使用placement-new在容器提供的位置就地构造元素。 参数args ...被转发给构造函数

这对于重物来说很重要。 我们可以看到这是原始提案的动机,其中说:

放置插入的动机是容器 - 尤其是基于节点的容器 - 对于重物的存储非常有用。 在某些环境中,效率非常重要,但通常无法在不复制元素的情况下将元素放入容器中。 重物可以直接存储其数据,在这种情况下,移动语义不会提高复制性能。 此外,当效率至关重要时,解决方案不能依赖于编译器优化,因为它们是可选的,并且可能不会出现在最需要它们的地方。 放置插入让我们在我们想要的容器中创建一次元素,而不必移动它或复制它。 它通过引入新的可变参数函数以简单直接的方式实现,这些函数接受使用可变参数模板和完美转发传递给元素构造函数的参数。

我们可以举例说明这与Effective Modern C ++有什么不同第42项:考虑安置而不是插入 ,其中有以下示例:

std::vector<std::string> vs; // container of std::string
vs.push_back("xyzzy"); // add string literal

这导致创建临时而不是:

vs.emplace_back("xyzzy");

没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM