2012-05-15 3 views
1

벡터 목록의 벡터 내용을 벡터로 복사하는 가장 효율적인 방법을 찾고 있습니다. 가능한 한 메모리 재 할당을 피하고 싶습니다. 내가 가진 :C++ : 효율적인 벡터 목록 벡터 복사

내 문제는 다음과

  • std::vector<int> v 포함하는 N 요소

  • 벡터 std::vector< std::vector<int>* > vlist

  • 의 목록과 내가 알고있는 요소의 총 수 vlist의 벡터에서 M은 < = N (N과 M은 매우 클 수 있음)

vlist의 모든 요소 (vlist [0]의 첫 번째 요소, 그리고 vlist [1] 등 ...)의 모든 요소를 ​​복사하고 끝에 v 크기를 줄이려고합니다. ~ M (내 프로젝트는 C++ 2011을 사용하지 않는다).

가능한 한 효율적으로 수행하는 방법은 무엇입니까?

대단히 감사합니다.

편집 : 비고 : V 이미 N 요소로 가득 내가 요소를 다른 벡터에서 오는 M (= N은 <)로 교체하고 싶습니다. 이것은 가장 효율적인 방법 경우

+0

메모리 할당을 피하려면 실제로 복사본을 얻을 수 없으므로 참조를 얻을 수 있습니다. 객체를 참조하거나 복사본을 만들 수 있습니다. 가장 직관적 인 옵션은 복사 할 때 메모리를 다시 사용하여 메모리 할당을 줄이는 것입니다. 벡터에'int's가 포함되어 있기 때문에 스택에 놓아서 힙에 할당하는 것보다 빠르다. – Kiril

답변

1

는 나도 몰라,하지만이 방법입니다 : 당신이 정말이 가장 효율적인 방법을 원하는 경우에

std::vector<int> v; 
std::vector< std::vector<int>* > vlist; 
int j = 0; 
for(int i = 0; i < vlist.size(); ++i) { 
    std::copy(vlist[i]->begin(), vlist[i]->end(), &v[j]); 
    j += vlist[i]->size(); 
} 
v.resize(j); 

, 당신은 몇 가지를 구현해야 할 수도 있습니다 다른 방법으로 속도를 비교하십시오.

+0

OP가 아니요 C++ 11 –

+0

감사합니다. –

0

가장 효율적인 방법은 복사하지 않는 것입니다. 응용 프로그램에서 필요한 것은 무엇입니까? 또한 vector<vector<int> > 대신 vector<* vector<int> >을 사용하는 이유는 무엇입니까? 등 주위 디자인, 사용 pimpl, 게으른 복사,

그리고 결국

나는 당신이 그 표준의 기본 복사 생성자를 이길 것 할 수 있다고 생각 모르겠어요. 기본 ctor가 병목인지 확인하기 위해 애플리케이션을 프로파일 링 했습니까?

0
std::vector<int> v; 
v.reserve(N); 
for(size_t i = 0; i<vlist.size(); i++) 
{ 
    v.insert(v.end(), vlist[i]->begin(), vlist[i]->end()); 
} 

M이 N에 가까울만큼 효율적이어야합니다. 그렇지 않으면 메모리를 할당하기 전에 M을 계산하고 v.reserve (M)를 사용하는 것이 좋습니다.

+3

크기 조정 대신 예비를 사용 하시겠습니까? 또한, vlist [i] -> begin()'과'vlist [i] -> end()' –

+0

은'v.resize (N)'이 아닌'v.reserve (N)'을 사용했다. resize actual은 데이터를 기본값으로 설정하고 reserve는 단지 공간을 할당합니다. – andre

+0

고맙습니다. 지금 고쳐졌습니다. –