a의 모든 값 std::vector<int>
을 0 으로 재설정 하고 벡터를 초기 크기로 유지 하는 가장 빠른 방법은 무엇입니까 ?
[] 연산자를 사용한 for 루프?
a의 모든 값 std::vector<int>
을 0 으로 재설정 하고 벡터를 초기 크기로 유지 하는 가장 빠른 방법은 무엇입니까 ?
[] 연산자를 사용한 for 루프?
답변:
std::fill(v.begin(), v.end(), 0);
v = std::vector<int>(vec_size,0)
) 의 새로운 벡터로 벡터를 다시 할당하는 것만 fill
으로 내 컴퓨터 보다 약간 더 빠릅니다.
assign
입니다.
당신이 가장 빠른 것에 대해 물을 때 항상 그렇듯이 : 측정! 위의 방법 사용 (Clang을 사용하는 Mac에서) :
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 ints의 벡터에서 100000 반복을 사용합니다.
편집 : 그럴듯하게이 숫자를 changeing하는 결과 시간을 변경하면 당신이 가질 수있는 약간의 자신감을 (안 최종 어셈블리 코드 검사 좋은 등) 인공 벤치 마크는 완전히 멀리 최적화되지 않았 음을. 물론 실제 상황에서 성능을 망쳐 놓는 것이 가장 좋습니다. 편집 종료
사용 된 코드를 참조하십시오 :
#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
작은 용량을 제외하고 속도가 느림 에 libc++
. CODE coliru / paste
fill
끔찍한 것처럼 보입니다. 그것은이다 , 2 차의 크기에 느린이 테스트한다.
방법에 대한 assign
멤버 함수?
some_vector.assign(some_vector.size(), 0);
정수로 구성된 벡터라면 먼저 시도해보십시오.
memset(&my_vector[0], 0, my_vector.size() * sizeof my_vector[0]);
그것은 C ++이 아니기 때문에 누군가가 이것을하는 올바른 방법을 제공 할 것이라고 확신합니다. :)
::std::fill
방법은 코드가 너무 빠르지 만 약간 인라인이 있기 때문에 다소 빠른 속도로 확장됩니다. 나는 그것을 읽는 것이 훨씬 좋기 때문에 여전히 그것을 사용합니다.
나는 똑같은 질문을했지만 다소 짧았습니다 vector<bool>
(faik 표준은 부울 요소의 연속 배열과 내부적으로 다르게 구현할 수 있습니다). 따라서 나는 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;
}
우분투 17.10에서 GCC 7.2.0 컴파일러를 사용했습니다. 컴파일 명령 줄 :
g++ -std=c++11 -O0 main.cpp
g++ -std=c++11 -O3 main.cpp