当我执行 example.push_back(row) 时,会创建一个新副本。我对么。
是的。
有没有好的方法来防止同样的
为什么要阻止它?这种行为使vector
使用变得简单和安全。
标准库容器具有值语义,因此它们会复制您添加到其中的值并管理这些值的生命周期,因此您无需担心。
任何人都可以提供参考资料,我可以阅读如何在 stl 中处理分配/解除分配
你没听说过搜索引擎吗?尝试http://www.sgi.com/tech/stl/Allocators.html作为初学者。
或者什么是避免此类内存复制问题的最佳实践(在大型应用程序的情况下)。
一般来说:忘记它。您通常不需要担心它,除非分析表明存在性能问题。
std::vector
确实允许对其内存使用进行更细粒度的控制,有关更多信息,请参阅http://www.sgi.com/tech/stl/Vector.html上的新成员部分和脚注。
对于您的示例,您可以向容器添加一个新行,example
然后将int
值直接添加到其中:
vector<vector<int>> example;
for(/*some conditions*/) {
example.resize(example.size()+1);
vector<int>& row = example.back();
for(/*some conditions*/) {
row.push_back(k); //k is some int.
}
}
更好的是提前在向量中保留足够的容量:
vector<vector<int>> example;
example.reserve( /* maximum expected size of vector */ );
for(/*some conditions*/) {
example.resize(example.size()+1);
vector<int>& row = example.back();
for(/*some conditions*/) {
row.push_back(k); //k is some int.
}
}