나는이 경우 std::vector
, 시작 싶지만은 대량 돌연변이의 두 번째 std::vector
, reserve()
적절하게 다음 swap()
벡터를 사용합니다.
업데이트
그것은이 일반적인 형태 걸릴 것 :
Borealid 좋은 점,
측정이 제기
std:vector<t_object*> source; // << source already holds 10000 elements
std:vector<t_object*> tmp;
// to minimize reallocations and frees to 1 and 1, if possible.
// if you do not swap or have to grow more, reserving can really work against you.
tmp.reserve(aMeaningfulReserveValue);
while (performingMassMutation) {
// "i scan through each element and lets every 20 elements"
for (twentyElements)
tmp.push_back(source[readPos++]);
// "every 20 elements i'll need to insert an new element"
tmp.push_back(newElement);
}
// approximately 500 iterations later…
source.swap(tmp);
- 실행이 극적으로 당신의 표준 라이브러리 구현에 따라 달라집니다를, 데이터를 크기, 복사 복잡성 등이 있습니다. 컬렉션 원시 포인터 용
는 내 구성이 크기는 질량 vector
돌연변이는 상기 push_back
std::list
삽입보다 7 배 더 빨랐다. push_back
은 vector
의 범위 삽입보다 빠릅니다.
Emile이 아래에서 지적한 것처럼 std::vector::swap()
은 요소를 이동하거나 다시 할당 할 필요가 없습니다. 즉, 내부자를 교환 할 수 있습니다 (할당자가 동일한 유형 인 경우).
흠, 복사본 대신 swapn. 좋은 생각. 그들은 모든 종류의 포인터이므로 스왑은 중요하지 않거나 느려질 수 있습니다 (다른 항목을 0으로 설정하는 것에서부터). 그러나 그것이 포인터가 아니라면 나는 스왑을 생각하지 않을 것이다. 좋은 대답. –
@ acidzombie24 내가 업데이트/확장했습니다. – justin
@ acidzombie24 :'vector :: swap '은 일정 시간입니다. 각 요소가 수백만 개의 요소를 가지고 있더라도 벡터 사이에 2 개 또는 3 개의 포인터 만 교환됩니다. 이러한 포인터는'm_start','m_end','m_storage_end'와 같은 것이 될 것입니다. 'vector :: swap'은 엄청나게 큰 물체를 벡터에 값으로 저장하고 있다고해도 엄청나게 빠를 것입니다. –