优化向量分配c ++

时间:2016-01-30 22:16:03

标签: c++ algorithm vector

我有一个返回向量的函数。我们将其命名为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();
    ...
}

4 个答案:

答案 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)

您有多种选择:

  1. 不要担心。表现通常不那么重要。

  2. 启用优化(您会惊讶于该步骤解决了多少关于SO的“优化”问题)。

  3. 升级到C ++ 11编译器。编译器应该使用vector的移动赋值运算符,这非常有效(任何体面的库都会将内部分配的数组从临时数据传输到目标,而不分配内存,也不会复制元素)。

  4. 如果你不能使用C ++ 11编译器,或者你已经测量过,这仍然是性能瓶颈,请按照his answer中的Bo Person的建议切换到初始化

  5. 如果你已经测量过,而这仍然是性能瓶颈,并且你无法让你的编译器实现RVO,那么你别无选择,只能传递向量按照his answer

  6. 中AndréFratelli所建议的价值计算

    如果我们退出讨论优化,并讨论编写好的,清晰的代码,那么我会按优先顺序推荐:

    • 从功能结果初始化
    • 从功能结果分配
    • 传入要填充的矢量。