У меня есть 2D-вектор, и я хочу, чтобы все значения int были заменены на нули.
Хотя этот код, похоже, работает, мне было интересно:
Нужно ли удалять старый вектор перед его переназначением (в строке 5), поскольку в std::vector<int> хранится копия line?
Это лучший способ заменить значения (используя итераторы)?
Код:
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
}
Я хочу избежать утечек памяти.
Предположим, что проще всего было бы просто иметь std::fill(it->begin(), it->end(), 0);...
Зависит от того, что вы делаете со своими векторами, но, возможно, отображение двух измерений в одномерном массиве более эффективно (auto getValue(r, c) { return v[r*columns + c]; }). Сохранение синтаксиса v[r][c] все еще возможно, но требует дополнительной работы (включая промежуточный класс).





Вам не нужно ничего 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 размещает эти элементы в динамической памяти, также известной как куча, но вам не нужно беспокоиться об освобождении или удалении этой памяти, потому что она обрабатывается внутренними компонентами вектора. Это означает, что память удаляется самое позднее, если вызывается деструктор вектора (например, потому что он выходит за пределы области видимости) или, возможно, раньше, если вы изменяете размер вектора.
Мне было интересно, поскольку я push_back вектор int, как он хранится? Я имею в виду, что исходный вектор хранится в стеке, поскольку он объявлен внутри метода класса, верно? Но тогда std::vector имеет дело с выделением памяти в куче? он собирает мусор?
Смотрите редактирование моего ответа (было слишком долго отвечать в качестве комментария).
Так как вы не звоните
new, вам не нужноdelete. Но вам, вероятно, следует сделатьlineссылку, чтобы избежать ненужных копий.