我有一个2D向量,我希望所有的int
值都用 zeros 代替。
尽管此代码似乎可以工作,但我想知道:
由于在std::vector<int>
中存储了line
的副本,我是否需要在重新分配旧向量之前删除它(在第5行)?
这是替换值(使用迭代器)的最佳方法吗?
代码:
for (std::vector< std::vector<int> >::iterator it = data.begin(); it != data.end(); ++it)
{
std::vector<int> line = *it;
std::fill(line.begin(), line.end(), 0);
*it = line; // line 5
}
我想避免内存泄漏。
答案 0 :(得分:4)
您不需要delete
代码中的任何内容,因为您无需使用new
创建任何内容。
如果您也想单行执行所有这些操作,则可以使用std::for_each
和std::fill
:
#include <algorithm>
#include <vector>
std::vector<std::vector<int>> a;
// set every element in two dimensional vector to 5
std::for_each(a.begin(), a.end(), [](std::vector<int> &x){std::fill(x.begin(), x.end(), 5);});
与您的评论有关的附录
是的,您的原始向量存储在堆栈中。由于您没有传递自定义分配器,因此向量将使用std::allocator
来分配其元素(在您的情况下是int的向量)。 std::allocator
在动态内存(也就是堆)中分配这些元素,但是您不必担心释放或删除此内存,因为它是由向量内部处理的。这意味着,如果调用了向量的析构函数(例如,因为它超出范围),则最晚在内存被删除,或者如果更改向量的大小,则可能会更早地删除内存。