为什么输出向量的大小会导致分配?

时间:2014-10-24 21:05:26

标签: c++ c++11 vector

采取以下计划:

const std::vector<std::vector<int>> v{10, std::vector<int>(10)};
std::cout << v.size() << std::endl;

本身只进行了12次分配。如果我添加一个循环:

for (auto e : v)
    std::cout << e.size() << " ";

进行了22次分配。是不是提前分配了?

3 个答案:

答案 0 :(得分:6)

因为您在每次迭代中复制了一个向量。尝试

for (const auto& e : v) // take a reference each iteration
    std::cout << e.size() << " "; 

并看到差异。

答案 1 :(得分:3)

for (auto e : v)创建导致分配的每个容器元素的副本。

原因是auto解析为std::vector<int>e是按值获取的。

要摆脱额外的分配,请使用for (auto& e : v)for (auto&& e : v)

您也可以写for (const auto& e : v),但此处的const是多余的,因为v是常量。

答案 2 :(得分:3)

使用for (auto e : v),您可以复制。

改为使用for (const auto& e : v)