-1

大多数时候,我对如何完成 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或避免此类内存复制问题的最佳实践(在大型应用程序的情况下)。

任何帮助表示赞赏。

4

2 回答 2

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.
    }
}
于 2013-06-28T14:16:44.153 回答
0

stl 实现所要做的就是遵守标准。

std::swap常用于将一个向量的内容与另一个向量进行切换。这可以用来防止值副本被获取,并且是实现效率的好方法,至少在 C++11 之前的世界中是这样。(在您的情况下,推回一个空向量并将其与您创建的向量交换)。

于 2013-06-28T14:13:07.520 回答