2

在下面的代码中有 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;
}
4

2 回答 2

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;
于 2013-03-14T14:19:30.407 回答
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 引用,因此只涉及您的结构的一个副本。使用我上面建议的任何方法仍然会做一个副本,但是副本的大小将受到检查,并且不会随着您的结构大小而缩放,这可能正是您在处理大型文件时想要的数据。

于 2013-03-14T14:34:21.843 回答