相关疑难解决方法(0)

在C++中将整个文件读入std :: string的最佳方法是什么?

如何将文件读入a std::string,即一次读取整个文件?

文本或二进制模式应由调用者指定.该解决方案应符合标准,便携且高效.它不应该不必要地复制字符串的数据,它应该避免在读取字符串时重新分配内存.

实现此目的的一种方法是统计文件大小,调整大小std::stringfread()进入std::string's const_cast<char*>()' data().这要求std::string数据是连续的,这是标准不需要的,但似乎是所有已知实现的情况.更糟糕的是,如果在文本模式下读取文件,则其std::string大小可能与文件大小不同.

一个完全正确的,符合标准的和便携式解决方案,可以构建使用std::ifstreamrdbuf()进入std::ostringstream,并从那里进入std::string.但是,这可能会复制字符串数据和/或不必要地重新分配内存.所有相关的标准库实现是否足够智能以避免所有不必要的开销?还有另一种方法吗?我是否错过了一些已经提供所需功能的隐藏Boost功能?

请显示您的建议如何实施.

void slurp(std::string& data, bool is_binary)
Run Code Online (Sandbox Code Playgroud)

考虑到上面的讨论.

c++ string file-io

155
推荐指数
10
解决办法
6万
查看次数

C++ 11和std :: vector构造函数中的值初始化对象

在C++中,几乎没有令人信服的理由使用C数组std::vector.其中一个令人信服的原因,至少在C++ 03中,是因为不可能使用向量来分配未初始化的对象数组."填充"构造函数std::vector是:

vector(size_type count, const T& value = T())

意思是...

int* array = new array[1000000];
Run Code Online (Sandbox Code Playgroud)

可能比以下方面更有效率:

std::vector<int> v(1000000);
Run Code Online (Sandbox Code Playgroud)

...因为向量构造函数必须对整数数组进行零初始化.因此,当使用POD向量时,没有真正的等价物malloc; 你能得到的最好的是相当于calloc.

C++ 11似乎改变了这一点,其概念是"值初始化".在C++ 11中,std::vector有一个新的构造函数,它接受一个size_type值,没有默认参数.这个"初始化"向量中的所有元素.C++ 11标准区分"值初始化"和"零初始化".

我的理解是"值初始化"等同于调用默认构造函数T.如果T是POD类型int,则默认构造函数只是创建一个未初始化的整数.因此,在C++ 11中,explicit vector::vector(size_type count)真正等同于mallocif T是POD.

但是,我对此的理解是基于C++ 11标准草案,而不是最终标准.

问题:我的理解是否正确?如果是POD,是否explicit vector::vector(size_type count)提供未初始化的数组(类似于malloc)T

c++ vector c++11

10
推荐指数
2
解决办法
6851
查看次数

标签 统计

c++ ×2

c++11 ×1

file-io ×1

string ×1

vector ×1