首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何为std::string对象预分配内存?

如何为std::string对象预分配内存?
EN

Stack Overflow用户
提问于 2010-07-22 04:28:21
回答 6查看 36.4K关注 0票数 30

我需要将一个文件复制到一个字符串中。我需要某种方法来为该字符串对象预分配内存,以及一种直接将文件内容读取到该字符串内存中的方法?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-22 04:30:27

用于预分配的std::string has a .reserve method

代码语言:javascript
复制
std::string s;
s.reserve(1048576); // reserve 1 MB
read_file_into(s);
票数 42
EN

Stack Overflow用户

发布于 2010-07-22 04:30:09

这应该是您需要的全部内容:

代码语言:javascript
复制
ostringstream os;
ifstream file("name.txt");
os << file.rdbuf();

string s = os.str();

这将从file中读取字符并将它们插入到字符串流中。之后,它将获取在幕后创建的字符串。请注意,我落入了以下陷阱:使用提取操作符将跳过初始空格。必须使用如上的插入操作符,或使用noskipws操纵器:

代码语言:javascript
复制
// Beware, skips initial whitespace!
file >> os.rdbuf();

// This does not skip it
file >> noskipws >> os.rdbuf(); 

这些函数被描述为逐个字符地读取流(虽然不确定这里可能进行哪些优化),但我没有对它们进行计时以确定它们的速度。

票数 6
EN

Stack Overflow用户

发布于 2010-07-22 04:53:06

为了好玩,这里有另一种方法:

代码语言:javascript
复制
// Beware, brain-compiled code ahead!

std::ifstream ifs( /* ... */ );
if( !ifs.good() ) return; // whatever

std::string str;

ifs.seekg( 0, std::ios_base::end );
const std::streampos pos = ifs.tellg();
ifs.seekg( 0, std::ios_base::beg );
if( pos!=std::streampos(-1) ) // can get stream size? 
  str.reserve(static_cast<std::string::size_type>(pos));

str.assign( std::istream_iterator<char>(ifs)
          , std::istream_iterator<char>() );

我希望我没有搞砸了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3303527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档