Подтвердить что ты не робот

Самый быстрый способ reset каждого значения std::vector <int> до 0

Каков самый быстрый способ reset для каждого значения a std::vector<int> до 0 и сохранения начального размера векторов?

A для цикла с [] оператором?

4b9b3361

Ответ 1

std::fill(v.begin(), v.end(), 0);

Ответ 2

Как всегда, когда вы спрашиваете о самом быстром: Измерьте! Используя приведенные выше методы (на Mac с помощью Clang):

Method      |  executable size  |  Time Taken (in sec) |
            |  -O0    |  -O3    |  -O0      |  -O3     |  
------------|---------|---------|-----------|----------|
1. memset   | 17 kB   | 8.6 kB  | 0.125     | 0.124    |
2. fill     | 19 kB   | 8.6 kB  | 13.4      | 0.124    |
3. manual   | 19 kB   | 8.6 kB  | 14.5      | 0.124    |
4. assign   | 24 kB   | 9.0 kB  | 1.9       | 0.591    |

используя 100000 итераций на вектор 10000 ints.

Изменить: Если изменение этих чисел правдоподобно изменяет результирующие времена, у вас может быть некоторая уверенность (не так хорошо, как проверка окончательного кода сборки), что искусственный тест не был полностью оптимизирован. Разумеется, лучше справляться с работой в реальных условиях. конец Редактировать

для ссылки на использованный код:

#include <vector>

#define TEST_METHOD 1
const size_t TEST_ITERATIONS = 100000;
const size_t TEST_ARRAY_SIZE = 10000;

int main(int argc, char** argv) {

   std::vector<int> v(TEST_ARRAY_SIZE, 0);

   for(size_t i = 0; i < TEST_ITERATIONS; ++i) {
   #if TEST_METHOD == 1 
      memset(&v[0], 0, v.size() * sizeof v[0]);
   #elif TEST_METHOD == 2
      std::fill(v.begin(), v.end(), 0);
   #elif TEST_METHOD == 3
      for (std::vector<int>::iterator it=v.begin(), end=v.end(); it!=end; ++it) {
         *it = 0;
      }
   #elif TEST_METHOD == 4
      v.assign(v.size(),0);
   #endif
   }

   return EXIT_SUCCESS;
}

Заключение: используйте std::fill (потому что, как говорили другие, большинство идиоматических)!

Ответ 3

Как насчет функции-члена assign?

some_vector.assign(some_vector.size(), 0);

Ответ 4

Если это всего лишь вектор целых чисел, я бы сначала попытался:

memset(&my_vector[0], 0, my_vector.size() * sizeof my_vector[0]);

Это не очень С++, поэтому я уверен, что кто-то предоставит правильный способ сделать это.:)

Ответ 5

попробуйте

std::fill

а также

std::size siz = vec.size();
//no memory allocating
vec.resize(0);
vec.resize(siz, 0);