>  기사  >  백엔드 개발  >  파일을 std::벡터로 효율적으로 읽는 방법은 무엇입니까?

파일을 std::벡터로 효율적으로 읽는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-09 18:13:02142검색

How to Efficiently Read a File into a std::vector?

파일을 std::Vector로 효율적으로 읽기

특정 시나리오에서는 파일을 std::Vector 불필요한 복사본과 오버헤드를 방지하려면 효율성이 중요합니다. 한 가지 접근 방식은 Reserve() 메서드를 사용하여 벡터에 공간을 할당한 다음 read()를 사용하여 벡터를 채우는 것입니다.

std::ifstream testFile("testfile", "rb");
std::vector<char> fileContents;
int fileSize = getFileSize(testFile);
fileContents.reserve(fileSize);
testFile.read(&fileContents[0], fileSize);

그러나 Reserve()를 사용하여 벡터 크기를 조정할 때 이 접근 방식은 실패합니다. 실제로 벡터에 요소를 삽입하지 않기 때문입니다. 결과적으로 fileContents[0]에 액세스하려고 하면 오류가 발생합니다.

반복자를 사용하는 대체 접근 방식

더 포괄적인 솔루션에는 반복기를 사용하는 것이 포함됩니다. 입력 파일 스트림을 사용하면 다음 스니펫을 통해 효율적인 파일 읽기가 가능합니다.

#include<iterator>

//...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),
                              std::istreambuf_iterator<char>());

이 접근 방식은 istreambuf_iterator를 활용하여 입력 파일 스트림을 반복하고 요소를 벡터에 직접 삽입합니다.

처리 재할당

재할당이 중요하다면 Reserve()를 사용하여 벡터:

#include<iterator>

//...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents;
fileContents.reserve(fileSize);
fileContents.assign(std::istreambuf_iterator<char>(testFile),
                     std::istreambuf_iterator<char>());

이 변형에서 Reserve()는 알려진 파일 크기를 기반으로 공간을 할당하는 데 사용되며 할당()은 반복자를 사용하여 벡터를 채우는 데 사용됩니다.

위 내용은 파일을 std::벡터로 효율적으로 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.