最快的方法将std :: vector <int>的每个值重置为0
将std::vector<int>
每个值重置为0并保持向量初始大小的最快方法是什么?
与[]运算符的for循环?
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 |
在10000个单位的vector上使用100000次迭代。
编辑:如果改变这个数字似乎改变了生成的时间,你可以有一些信心(不如检查最终的汇编代码),人造基准还没有完全优化。 当然,最好在实际情况下调整性能。 结束编辑
供参考使用的代码:
#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]);
这不是非常C ++,所以我敢肯定有人会提供这样做的正确方法。 🙂
尝试
std::fill
并且
std::size siz = vec.size(); //no memory allocating vec.resize(0); vec.resize(siz, 0);