c++ - 使用 istream_iterators 构造 vector

标签 c++ stl vector iterator

我记得曾经见过一种使用迭代器将整个二进制文件读入 vector 的巧妙方法。它看起来像这样:

#include <fstream>
#include <ios>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    ifstream source("myfile.dat", ios::in | ios::binary);
    vector<char> data(istream_iterator(source), ???);
    // do stuff with data
    return 0;
}

这个想法是通过传递指定整个流的输入迭代器来使用 vector 的迭代器范围构造函数。问题是我不确定要为 end 迭代器传递什么。

如何为文件末尾创建 istream_iterator?我是不是完全记错了这个成语?

最佳答案

你想要 std::istreambuf_iterator<> , 用于原始输入。 std::istream_iterator<>用于格式化输入。至于文件的结尾,使用流迭代器的默认构造函数。

std::ifstream source("myfile.dat", std::ios::binary);
std::vector<char> data((std::istreambuf_iterator<char>(source)),
                       std::istreambuf_iterator<char>());

编辑以满足C++'s most vexing parse .谢谢,@UncleBens。

关于c++ - 使用 istream_iterators 构造 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423361/

相关文章:

C++ 映射访问丢弃限定符 (const)

javascript - 添加 Loader 直到 STL 图像加载 PHP

c++ - 长 double 的加权概率

C++,静态初始化是否由多个线程执行?

java - 猜猜密码OOXML文件的应用?

c++ - STL 映射 C++ 中的最高值?

arrays - 根据其内容将向量拆分为多个向量

c++ - 从高度动态的 C++ 数据模型更新 QML : Timer vs Property binding

c++ - 有没有办法使用 C++17 折叠表达式来实现它?

c++ - ublas::vector push_back 在哪里?