2012-03-19 4 views
25

를 내가 두 벡터를 가지고 하나에 결합 할 경우에, 나는 그것을 다음과 같은 방법을 수행 할 수 있습니다 내가 피하려고하는,하지만 복사를 포함"이동"두 벡터 함께

std::vector<T> a(100); // just some random size here 
std::vector<T> b(100); 

a.insert(std::end(a), std::begin(b), std::end(b)); 

. 그들을 움직이기 위해 움직이는 의미를 사용할 방법이 있습니까?
vector은 인접한 것으로 간주되므로 매우 의심 스럽습니다. 그러나 deque으로 할 수있는 방법이 있습니까? 당신이 이동 반복자를 사용할 수 있습니다, 또는

#include <algorithm> 
std::move(b.begin(), b.end(), std::back_inserter(a)); 

을 :

답변

48

예, std::move 사용

a.insert(a.end(), 
     std::make_move_iterator(b.begin()), std::make_move_iterator(b.end())); 

이 두 경우 모두 #include <iterator>에 기억하고, 당신이 시작하기 전에, 말 :

a.reserve(a.size() + b.size()); 

확인 및 증분에 비해 값 초기화 비용에 따라 크기 카운터를 입력하면 다음 변형도 재미있을 수 있습니다.

std::size_t n = a.size(); 
a.resize(a.size() + b.size()); 
std::move(b.begin(), b.end(), a.begin() + n); 
+0

감사합니다. 이제 왜 cppreference에 두 가지 버전의'std :: move'가 있는지 압니다. 나는 항상 버그라고 생각하고 두 번째 버전을 확인하지 않았다. – inf

+3

나는'움직임 '또한 알고리즘이라고 완전히 놓쳤다. – bames53

+0

@ bames53 나에게도 똑같은 일이 있지만, 듣고 나서, 그것은 '복사'가 있기 때문에 완전한 의미를가집니다. – inf

7

이동하려는 항목에 따라 다릅니다. 벡터를 이동하면 내부 배열 포인터를 효과적으로 교체하여 벡터를 수행합니다. 따라서 하나의 벡터가 이전에 다른 벡터가 소유 한 배열을 가리킬 수 있습니다.

하지만 두 개의 벡터를 병합 할 수는 없습니다.

std::move(b.begin(), b.end(), std::back_inserter(a)); 

는 다시,이 벡터를 반복하고 대상 벡터에 모든 요소를 ​​이동 :

당신이 다음 할 수있는 최선은 Kerrek의 대답에서와 같이 모든 개인 회원 요소를 이동하는 것입니다.

+0

질문, 그것은 어떤 차이가 있습니까? 본질적으로 a의 물체를 b의 위치에 복사하지 않습니까? op의 질문과 같이 insert와 같은 것을하지 않습니까? – nnrales

+0

만약에 객체가 복잡하다면, 그들의 복사본 ctors는 호출되지 않을 것입니다. 단지 메모리 복사본입니까? – nnrales