采取以下计划:
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次分配。是不是提前分配了?
答案 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)
。