大多数时候,我对如何完成stl对象的分配/释放感到困惑。例如:采取这个循环。
vector<vector<int>> example;
for(//some conditions) {
vector<int>row;
for(//some conditions) {
row.push_back(k); //k is some int.
}
example.push_back(row);
}
在这种情况下,对象行发生了什么。如果我通过示例访问,我仍然可以看到值,这意味着当我example.push_back(row)
创建新副本时。我对么。是否有一种防止相同的好方法(如果我是正确的)。
也可以给任何人提供参考资料,我可以在其中阅读stl
中如何处理分配/解除分配,或者是什么是避免此类内存复制问题的最佳实践(如果是大型应用程序)。
任何帮助表示感谢。
答案 0 :(得分:3)
当我执行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.
}
}
答案 1 :(得分:0)
所有stl实现都必须遵守标准。
但std::swap
通常用于将矢量的内容与另一个切换。这可用于防止获取有价值的副本,并且是实现效率的好方法,至少在C ++ 11之前的世界中是这样。 (在你的情况下,推回一个空的向量并将其与你创建的向量交换。)