我有一个返回向量的函数。我们将其命名为v
。我在函数中使用v.begin()
和v.end()
。如何在不创建新向量.begin()
的情况下使用.end()
和v2
来存储上一个向量v
,以便我可以访问方法?
这就是我的意思:
std::vector<int> merge(...) {
...
return v;
}
void mergeSort(...) {
...
std::vector<int> v2;
v2 = merge(...);
I_need_this = v2.begin();
And_I_really_need_this_too = v2.end();
...
}
答案 0 :(得分:3)
优化分配的最佳方法是根本不分配,而是使用初始化
std::vector<int> v2 = merge(...);
几乎可以肯定,编译器会直接在v
创建v2
,而不会进行任何复制。
答案 1 :(得分:0)
当您需要返回集合以防止它们被复制时,常见的模式是通过非const引用传递集合并对原始集合进行更改。这意味着调用者负责实例化集合,而不是被调用者,因此不会发生任何副本。这是一个例子:
void merge(std::vector<int> & result, ...) {
// Do changes to result
...
}
void mergeSort(...) {
...
std::vector<int> v;
merge(v, ...);
// This is OK now
I_need_this = v.begin();
And_I_really_need_this_too = v.end();
...
}
答案 2 :(得分:0)
您可以将临时矢量绑定到引用:
extern std::vector<int> f();
auto&& x = f();
std::sort(x.begin(), x.end()); // example
答案 3 :(得分:0)
您有多种选择:
不要担心。表现通常不那么重要。
启用优化(您会惊讶于该步骤解决了多少关于SO的“优化”问题)。
升级到C ++ 11编译器。编译器应该使用vector的移动赋值运算符,这非常有效(任何体面的库都会将内部分配的数组从临时数据传输到目标,而不分配内存,也不会复制元素)。
如果你不能使用C ++ 11编译器,或者你已经测量过,这仍然是性能瓶颈,请按照his answer中的Bo Person的建议切换到初始化
如果你已经测量过,而这仍然是性能瓶颈,并且你无法让你的编译器实现RVO,那么你别无选择,只能传递向量按照his answer
如果我们退出讨论优化,并讨论编写好的,清晰的代码,那么我会按优先顺序推荐: