두 std :: vectors 연결 어떻게 연결 합니까?

std::vectors를 어떻게 연결 합니까?



답변

vector1.insert( vector1.end(), vector2.begin(), vector2.end() );

답변

C ++ 11을 사용 중이고 단순히 요소를 복사하지 않고 요소를 이동하려면 std::move_iteratorinsert (또는 copy)와 함께 사용할 수 있습니다 .

#include <vector>
#include <iostream>
#include <iterator>

int main(int argc, char** argv) {
  std::vector<int> dest{1,2,3,4,5};
  std::vector<int> src{6,7,8,9,10};

  // Move elements from src to dest.
  // src is left in undefined but safe-to-destruct state.
  dest.insert(
      dest.end(),
      std::make_move_iterator(src.begin()),
      std::make_move_iterator(src.end())
    );

  // Print out concatenated vector.
  std::copy(
      dest.begin(),
      dest.end(),
      std::ostream_iterator<int>(std::cout, "\n")
    );

  return 0;
}

int를 사용하는 예는 복사하는 것보다 효율적이지 않기 때문에 int가있는 예에서는 더 효율적이지 않지만 이동이 최적화 된 데이터 구조의 경우 불필요한 상태를 복사하지 않아도됩니다.

#include <vector>
#include <iostream>
#include <iterator>

int main(int argc, char** argv) {
  std::vector<std::vector<int>> dest{{1,2,3,4,5}, {3,4}};
  std::vector<std::vector<int>> src{{6,7,8,9,10}};

  // Move elements from src to dest.
  // src is left in undefined but safe-to-destruct state.
  dest.insert(
      dest.end(),
      std::make_move_iterator(src.begin()),
      std::make_move_iterator(src.end())
    );

  return 0;
}

이동 후 src의 요소는 정의되지 않았지만 파괴하기에 안전한 상태로 유지되며 이전 요소는 마지막에 dest의 새 요소로 직접 전송되었습니다.


답변

insert 함수 를 다음과 같이 사용합니다 .

vector<int> a, b;
//fill with data
b.insert(b.end(), a.begin(), a.end());

답변

또는 다음을 사용할 수 있습니다.

std::copy(source.begin(), source.end(), std::back_inserter(destination));

이 패턴은 두 벡터가 정확히 같은 유형의 것을 포함하지 않는 경우 유용합니다. std :: back_inserter 대신 무언가를 사용하여 한 유형에서 다른 유형으로 변환 할 수 있기 때문입니다.


답변

C ++ 11에서는 벡터 b를 a에 추가하는 것이 좋습니다.

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

ab중복되지 않고, b더 이상 사용하지 않을.


이다 std::move에서 <algorithm>의하지 보통 std::move 에서 <utility>.


답변

std::vector<int> first;
std::vector<int> second;

first.insert(first.end(), second.begin(), second.end());

답변

나는 이미 언급 한 것을 선호합니다 :

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

그러나 C ++ 11을 사용하는 경우 일반적인 방법이 하나 더 있습니다.

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

또한 질문의 일부는 아니지만 reserve더 나은 성능을 위해 추가하기 전에 사용하는 것이 좋습니다 . 그리고 벡터를 예약하지 않고 자체와 연결하면 실패하므로 항상해야합니다 reserve.


기본적으로 필요한 것 :

template <typename T>
void Append(std::vector<T>& a, const std::vector<T>& b)
{
    a.reserve(a.size() + b.size());
    a.insert(a.end(), b.begin(), b.end());
}