如何完成标准模板库中对象的分配/释放

时间:2013-06-28 14:09:26

标签: c++ stl

大多数时候,我对如何完成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中如何处理分配/解除分配,或者是什么是避免此类内存复制问题的最佳实践(如果是大型应用程序)。

任何帮助表示感谢。

2 个答案:

答案 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之前的世界中是这样。 (在你的情况下,推回一个空的向量并将其与你创建的向量交换。)