Каков самый быстрый способ reset для каждого значения a std::vector<int>
до 0 и сохранения начального размера векторов?
A для цикла с [] оператором?
Каков самый быстрый способ reset для каждого значения a std::vector<int>
до 0 и сохранения начального размера векторов?
A для цикла с [] оператором?
std::fill(v.begin(), v.end(), 0);
Как всегда, когда вы спрашиваете о самом быстром: Измерьте! Используя приведенные выше методы (на 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
(потому что, как говорили другие, большинство идиоматических)!
Как насчет функции-члена assign
?
some_vector.assign(some_vector.size(), 0);
Если это всего лишь вектор целых чисел, я бы сначала попытался:
memset(&my_vector[0], 0, my_vector.size() * sizeof my_vector[0]);
Это не очень С++, поэтому я уверен, что кто-то предоставит правильный способ сделать это.:)
попробуйте
std::fill
а также
std::size siz = vec.size();
//no memory allocating
vec.resize(0);
vec.resize(siz, 0);