자체 콘텐츠로 벡터를 확장하는 효율적인 방법
C에서 벡터 컨테이너는 동적 메모리 관리에 널리 사용됩니다. 루프를 사용하지 않고 벡터의 내용을 자체에 추가하는 경우 개발자는 종종 효율적인 솔루션을 검색합니다.
한 가지 접근 방식은 std::copy 함수를 사용하는 것입니다. 그러나 질문에서 언급했듯이 이는 분할 오류로 이어질 수 있습니다. 그 이유는 단순히 요소를 기존 벡터의 끝에 복사하면 원래 요소가 차지하는 메모리가 겹치기 때문입니다.
보다 안정적인 솔루션은 std::resize의 조합을 사용합니다. 그리고 std::copy_n. 다음 코드 조각은 이 접근 방식을 보여줍니다.
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count);
이 접근 방식은 먼저 std::resize를 사용하여 벡터의 용량을 늘리는 방식으로 작동합니다. std::resize는 필요한 경우 메모리를 재할당하므로 old_count 변수를 사용하여 원래 크기를 기억해야 합니다. 후속 std::copy_n 작업은 원래 요소를 새로 할당된 메모리에 복사하여 벡터의 내용을 효과적으로 복제합니다.
std::resize의 대안은 std::reserve는 지정된 수의 요소를 보유할 만큼 충분한 메모리만 할당합니다. 그러나 std::reserve를 사용한 후에도 std::copy_n은 여전히 필요합니다. 왜냐하면 끝 반복자가 벡터 끝 너머의 한 요소를 가리키므로 삽입할 수 없게 되기 때문입니다.
std::insert와 std::push_back에는 재할당이 필요할 수 있으며, 이로 인해 삽입 지점 이전의 기존 반복자와 참조가 무효화될 수 있습니다. 따라서 루프를 사용하지 않고 벡터 자체에 벡터를 추가하려면 std::resize 또는 std::reserve 및 std::copy_n 안정적이고 효율적인 솔루션을 제공합니다.
위 내용은 C에서 자체 내용으로 벡터를 효율적으로 확장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!