Bagaimana untuk Cekap Membaca Fail menjadi std::vector?

Susan Sarandon
Lepaskan: 2024-11-09 18:13:02
asal
171 orang telah melayarinya

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);
Salin selepas log masuk

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>());
Salin selepas log masuk

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>());
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan