我有几个大向量(大致有一百万个元素),比如在函数或类成员函数中生成vector<int> v
。我希望有效地在这个函数/成员之外使用这个向量,即,当我将它作为输出传递时,避免完全复制它
vector<int> make_vect() {
vector<int> v(1e6);
... // some analysis
return v;
}
int main() {
vector<int> v = make_vect();
}
我知道我可以使用指向此向量vector<int> *v
的指针,但这会使事情变得复杂一些(例如我必须手动删除它们等等)。我想知道如果我不使用引用或指针,上面的代码是如何表现的。
除了复制问题,在上面的代码中何时释放分配的内存?除非我调用v.clear(),否则内容永远不会被删除?或者当没有指向容器的变量时,它会自动删除它们?
答案 0 :(得分:4)
这正是你应该按价值返回物品的方式。编译器将应用NRVO优化以确保不进行复制。
答案 1 :(得分:0)
我喜欢这样做:
void make_vect(vector<int> *dest)
{
dest->resize(1000000);
... // some analysis
}
int main()
{
vector<int> v;
make_vect(&v);
}
其他人会使用矢量&amp;而不是矢量*,但我认为使用指针表示被调用的函数应该写入它。
答案 2 :(得分:0)
虽然通过值和使用指针都可以在这个特定的实例中工作,但我不会使用指针进行折扣,因为它们更复杂一些。如果您正在进行任何动态分配,它实际上可能会简化您的流程,现在就开始使用指针,这样您就不必返回并稍后更改所有内容。只是我的两分钱!