什么是最快的方法来重置std::vector<int>到0的每个值,并保持向量的初始大小?
使用[]操作符的for循环?
什么是最快的方法来重置std::vector<int>到0的每个值,并保持向量的初始大小?
使用[]操作符的for循环?
当前回答
我有同样的问题,但关于相当短的向量<bool> (afaik标准允许在内部实现它不同于布尔元素的连续数组)。因此,我重复了Fabio Fracassi稍作修改的测试。结果如下(次数,单位:秒):
-O0 -O3
-------- --------
memset 0.666 1.045
fill 19.357 1.066
iterator 67.368 1.043
assign 17.975 0.530
for i 22.610 1.004
显然,对于这些大小,vector<bool>::assign()更快。用于测试的代码:
#include <vector>
#include <cstring>
#include <cstdlib>
#define TEST_METHOD 5
const size_t TEST_ITERATIONS = 34359738;
const size_t TEST_ARRAY_SIZE = 200;
using namespace std;
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], false, v.size() * sizeof v[0]);
#elif TEST_METHOD == 2
std::fill(v.begin(), v.end(), false);
#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(),false);
#elif TEST_METHOD == 5
for (size_t i = 0; i < TEST_ARRAY_SIZE; i++) {
v[i] = false;
}
#endif
}
return EXIT_SUCCESS;
}
我在Ubuntu 17.10上使用GCC 7.2.0编译器。编译的命令行:
g++ -std=c++11 -O0 main.cpp
g++ -std=c++11 -O3 main.cpp
其他回答
如果它只是一个整数向量,我首先尝试:
memset(&my_vector[0], 0, my_vector.size() * sizeof my_vector[0]);
它不是很c++,所以我相信有人会提供正确的方式来做这件事。:)
我有同样的问题,但关于相当短的向量<bool> (afaik标准允许在内部实现它不同于布尔元素的连续数组)。因此,我重复了Fabio Fracassi稍作修改的测试。结果如下(次数,单位:秒):
-O0 -O3
-------- --------
memset 0.666 1.045
fill 19.357 1.066
iterator 67.368 1.043
assign 17.975 0.530
for i 22.610 1.004
显然,对于这些大小,vector<bool>::assign()更快。用于测试的代码:
#include <vector>
#include <cstring>
#include <cstdlib>
#define TEST_METHOD 5
const size_t TEST_ITERATIONS = 34359738;
const size_t TEST_ARRAY_SIZE = 200;
using namespace std;
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], false, v.size() * sizeof v[0]);
#elif TEST_METHOD == 2
std::fill(v.begin(), v.end(), false);
#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(),false);
#elif TEST_METHOD == 5
for (size_t i = 0; i < TEST_ARRAY_SIZE; i++) {
v[i] = false;
}
#endif
}
return EXIT_SUCCESS;
}
我在Ubuntu 17.10上使用GCC 7.2.0编译器。编译的命令行:
g++ -std=c++11 -O0 main.cpp
g++ -std=c++11 -O3 main.cpp
std::fill(v.begin(), v.end(), 0);
那么assign成员函数呢?
some_vector.assign(some_vector.size(), 0);
try
std::fill
也
std::size siz = vec.size();
//no memory allocating
vec.resize(0);
vec.resize(siz, 0);