> 백엔드 개발 > C++ > 본문

C에서 자체 내용으로 벡터를 효율적으로 확장하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-11 07:57:02
원래의
356명이 탐색했습니다.

How to Efficiently Extend a Vector with its Own Content in C  ?

자체 콘텐츠로 벡터를 확장하는 효율적인 방법

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::insertstd::push_back에는 재할당이 필요할 수 있으며, 이로 인해 삽입 지점 이전의 기존 반복자와 참조가 무효화될 수 있습니다. 따라서 루프를 사용하지 않고 벡터 자체에 벡터를 추가하려면 std::resize 또는 std::reservestd::copy_n 안정적이고 효율적인 솔루션을 제공합니다.

위 내용은 C에서 자체 내용으로 벡터를 효율적으로 확장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿