한 벡터를 다른 벡터로 복사하는 빠른 방법 가지 방법을 선호합니다

나는 두 가지 방법을 선호합니다 :

void copyVecFast(const vec<int>& original)
{
  vector<int> newVec;
  newVec.reserve(original.size());
  copy(original.begin(),original.end(),back_inserter(newVec));
}

void copyVecFast(vec<int>& original)
{

  vector<int> newVec;
  newVec.swap(original);
}

어떻게합니까?



답변

참조로 인수를 보내면 두 번째 예가 작동하지 않습니다. 를 의미 한거야

void copyVecFast(vec<int> original) // no reference
{

  vector<int> new_;
  new_.swap(original);
}

작동하지만 더 쉬운 방법은

vector<int> new_(original);


답변

그들은 같지 않습니까? 하나는 사본이고 다른 하나는 스왑 입니다. 따라서 함수 이름입니다.

내가 가장 좋아하는 것은 :

a = b;

어디에 a그리고 b벡터입니다.


답변

이것은 벡터의 복사본을 만드는 또 다른 유효한 방법입니다. 생성자를 사용하십시오.

std::vector<int> newvector(oldvector);

이것은 std::copy전체 벡터를 처음부터 끝까지 std::back_insert새 벡터로 옮길 때 사용 하는 것보다 훨씬 간단 합니다.

즉, .swap()하나는 사본이 아니며 대신 두 벡터를 바꿉니다. 더 이상 아무것도 포함하지 않도록 원본을 수정하십시오! 사본이 아닙니다.


답변

직접 답변 :

  • =연산자 사용

벡터의 값을 다른 값으로 할당하기 위해 std::vector::operator=컨테이너 의 public 멤버 함수 를 사용할 수 있습니다 std::vector.

  • 생성자 함수 사용

게다가 생성자 함수도 의미가 있습니다. 매개 변수로 다른 벡터를 가진 생성자 함수 (예 :xx 는의 순서대로 각 요소의 복사본이있는 컨테이너를 구성합니다 .

주의:

  • 사용하지 마세요 std::vector::swap

std::vector::swap벡터를 다른 벡터로 복사 하지 않고 이름에서 알 수 있듯이 실제로 두 벡터의 요소를 교체합니다. 다시 말해, 복사 할 소스 벡터 std::vector::swap가 호출 된 후 수정 됩니다. 이는 아마도 예상과 다릅니다.

  • 깊거나 얕은 사본?

소스 벡터의 요소가 다른 데이터에 대한 포인터 인 경우 때로는 딥 카피가 필요합니다.

Wikipedia에 따르면 :

딥 카피는 필드가 역 참조됨을 의미합니다. 복사중인 객체에 대한 참조가 아니라 참조 된 객체에 대해 새로운 복사 객체가 생성되며이 객체에 대한 참조는 B에 배치됩니다.

실제로 현재 C ++에는 딥 카피를 수행하는 기본 제공 방법이 없습니다. 위에서 언급 한 모든 방법은 얕습니다. 딥 카피가 필요한 경우 벡터를 탐색하고 참조 사본을 수동으로 만들 수 있습니다. 또는 순회를 위해 반복자가 고려 될 수 있습니다. 반복자에 대한 토론은이 질문을 넘어선 것입니다.

참고 문헌

std::vectorcplusplus.com 의 페이지


답변

스왑을 사용하여 벡터를 복사하면 안되며 “원본”벡터가 변경됩니다.

대신 원본을 매개 변수로 새 매개 변수로 전달하십시오.


답변

new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2


답변

벡터가 이미 존재하고 방금 복사하려는 경우 다음을 수행 할 수 있습니다.

newVec.resize(oldVec.size());
memcpy(&newVec.at(0), &oldVec.at(0), oldVec.size());