Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Cekap Membaca Fail menjadi std::vector?

Bagaimana untuk Cekap Membaca Fail menjadi std::vector?

Susan Sarandon
Susan Sarandonasal
2024-11-09 18:13:02223semak imbas

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

Pembacaan Fail yang Cekap ke dalam std::vector

Dalam senario tertentu, membaca fail ke dalam std::vector cekap adalah penting untuk mengelakkan salinan dan overhed yang tidak perlu. Satu pendekatan melibatkan penggunaan kaedah rizab() untuk memperuntukkan ruang bagi vektor, diikuti dengan menggunakan read() untuk mengisi vektor.

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

Walau bagaimanapun, pendekatan ini gagal apabila mengubah saiz vektor dengan rizab(), kerana ia sebenarnya tidak memasukkan elemen ke dalam vektor. Akibatnya, cubaan untuk mengakses fileContents[0] akan menyebabkan ralat.

Pendekatan Alternatif Menggunakan Iterator

Penyelesaian yang lebih komprehensif melibatkan penggunaan iterator. Menggunakan strim fail input, coretan berikut membolehkan pembacaan fail yang cekap:

#include<iterator>

//...

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

Pendekatan ini menggunakan istreambuf_iterator untuk lelaran pada aliran fail input dan memasukkan elemen terus ke dalam vektor.

Pengendalian Pengagihan Semula

Jika peruntukan semula menjadi kebimbangan, rizab() boleh digunakan untuk pra-peruntukkan ruang dalam vektor:

#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>());

Dalam variasi ini, rizab() digunakan untuk memperuntukkan berdasarkan ruang pada saiz fail yang diketahui, dan assign() digunakan untuk mengisi vektor menggunakan iterator.

Atas ialah kandungan terperinci Bagaimana untuk Cekap Membaca Fail menjadi std::vector?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn