在下面的代码中,有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;
}
答案 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)
如果你真的确定性能在这里是至关重要的,那么你将需要/实现引用语义。
vector<boost::shared_ptr<Details> >
。由于您使用的是C ++ 03,请注意>
。至于你的例子,请注意在C ++ 03中,push_back采用const引用,因此只涉及一个结构的副本。使用我上面提到的任何方法仍然会做一个副本,但副本的大小将被检查,并且不会随着结构的大小而缩放,这可能正是您在使用大型文件时所需的大小。数据