2014-12-22 2 views
0

벡터 V의 크기를 처음부터 끝까지 줄이려면 값싼 방법이 있습니까? 이러한 결과는 벡터 W이 같다고 :cpp의 벡터 크기 조정

V = 1,2,3,4

W = 2,3,4

복사 나쁜 용액 때 벡터에 저장된 데이터 매우 길다. 더 나은 솔루션이 있는지 궁금합니다. 여기

vector<Foo> moved_vector(std::make_move_iterator(v.begin()+1), 
         std::make_move_iterator(v.end())); 

우리가 Foo가 이동 유형이 있다고 가정 : 당신은 의미를 이동 지원하는 벡터가있는 경우

답변

1

이 솔루션은 vector 대신 deque을 사용하는 것입니다, 그것은 효율적으로 추가 설계부터 양쪽 끝에서 제거하십시오.

어떤 이유로 벡터가 붙어 있다면 비효율적입니다. 주위에.

0

std::move_iterator의 도움으로 이전에서 새 벡터를 생성하기 위해 move_iterator을 사용할 수 있습니다 .

POD의 경우 이동은 복사와 동일하므로 아무 것도 저장하지 않습니다. 그러나 예를 들어 std::string, 위의 내용이 다릅니다.

1

아니요, 쉬운 방법은 없습니다. 벡터는 백 엔드에서만 성장하고 축소됩니다. 당신이 벡터를 포장하고 계산 만 그 부분을 사용하고자하는 경우, 당신은 벡터에의 오프셋 (offset)에 저장하고, 일반 begin() 대신에 std::next(v.begin(), offset)을 전달할 수 :

vector<int> v {1,2,3,4}; 
size_t offset = 1; 
ostream_iterator<int> out_it(std::cout,", "); 
copy(next(v.begin(), offset), v.end(), out_it); 

Demo.

이 접근 방식의 문제점은 0..offset-1 요소에 대한 메모리가 실행 환경으로 다시 릴리스되지 않는다는 것입니다.

0

당신이 사본을 할 것 std::vector::erase있다가 그 나머지 요소 (해당하는 경우 이동) 최고 :

V.erase(V.begin());