Установка второго измерения вектора векторов на ноль (C ++) - PullRequest
1 голос
/ 01 февраля 2012

Есть вектор векторов:

std::vector <std::vector <float> > VoV;
VoV.resize(num);   // num is determined at run-time
for (int i=0; i<num; ++i) {

    VoV[i].resize(3);   // initializing to zero
}

Я хочу установить все три элемента на ноль после некоторых манипуляций. Я имею в виду, я знаю, что изначально они будут установлены на ноль, однако их значения через некоторое время изменятся, и я хочу снова установить их все на ноль. Итак, верно ли следующее? Это эффективно и есть лучший способ?

std::fill(VoV.begin(), VoV.end(), 0.f);

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Существует множество способов обнулить все данные. Возможно, самое простое:

VoV = std::vector<std::vector<float> >(num, std::vector<float>(3, 0.));

Или,

std::fill(VoV.begin(), VoV.end(), std::vector<float>(3, 0.));

Или,

for(std::vector<float>& v : VoV)
  std::fill(v.begin(), v.end(), 0.);

Или даже:

for(auto& v : Vov)
  for(auto& f : v)
    f = 0;

Примечание. Я не проверял ни одного из них.

1 голос
/ 01 февраля 2012

Неа. У вас есть вектор вектора, поэтому для его заполнения вам нужен вектор. В дополнение к ответу Роба, чтобы повысить производительность, делайте это в цикле (сохраняя свой синтаксис / стиль):

for (int i=0; i<num; ++i) {
    VoV[i].fill(VoV[i].begin(), VoV[i].end(), 0.f);   // initializing to zero
}

В этом случае вы избежите выделения памяти, повторно используя существующие векторы.

...