std :: vector中的高效push_back

时间:2013-03-14 14:10:54

标签: c++

在下面的代码中,有3个对象为d1,d2是为了执行push_back()而创建的。 一个是我创建时,一个是调用v.push_back()而另一个是实际复制到向量中{我不确定}。

如果不在C ++ 03中使用std :: vector,最好的替代方法是避免这种情况吗?

#include <iostream>
#include <vector>
#include <string>

using namespace std;

struct Details
{
    string fname;
    string lname;
    string address;
    int age;
};

int main(int argc, char **argv)
{
    vector<Details> v;

    Details d1;
    d1.fname = "vivek";
    d1.lname = "kumar";
    d1.address = "New Delhi";
    d1.age = 25;

    v.push_back(d1);

    Details d2;
    d2.fname = "some name";
    d2.lname = "some lastname";
    d2.address = "some address";
    d2.age = 25;

    v.push_back(d2);

    return 0;
}

2 个答案:

答案 0 :(得分:6)

调用std::vector::push_back()本身不会创建副本,因为传递了const引用。它只创建成为矢量元素的副本。此副本是std::vector的语义所必需的。

在复制相对便宜的时候,你也可以push_back() Details

Details d1; // Now the 3 strings of d1 are still small
v.push_back(d1); // essentially copies 3 empty strings and an int.
v.back().fname = "vivek";
v.back().lname = "kumar";
v.back().address = "New Delhi";
v.back().age = 25;

答案 1 :(得分:1)

如果你真的确定性能在这里是至关重要的,那么你将需要/实现引用语义。

  • 在C ++ 11中你有移动语义,所以你要为Details结构实现一个移动构造函数,所以我通常强烈建议使用它
  • 由于您使用的是C ++ 03,因此您可以使用boost :: shared_ptr来包装您的Details结构,如下所示:vector<boost::shared_ptr<Details> >。由于您使用的是C ++ 03,请注意>
  • 之间的空格字符
  • 通常我会推荐使用unique_ptr而不是shared_ptr,但unique_ptr仅在C ++ 11中可用,其中移动语义替代方案在大多数情况下更好。
  • 我不推荐原始指针的原因是因为你需要为它们手动管理内存,这是禁忌。

至于你的例子,请注意在C ++ 03中,push_back采用const引用,因此只涉及一个结构的副本。使用我上面提到的任何方法仍然会做一个副本,但副本的大小将被检查,并且不会随着结构的大小而缩放,这可能正是您在使用大型文件时所需的大小。数据