std::cin >> std::string 是如何实现的?
How is std::cin >> std::string implemented?
特别是,代码如何检查是否应该重新分配字符的内存?或者用户输入了多少个字符?如果我想将 C 字符串的值分配给我的字符串类实现,我可能会做这样的事情
String& operator=(String& to, const char *from)
{
if((strlen(from) + 1) > to.size) {
if (to.str != NULL) {
delete[] to.str;
to.str = NULL;
}
to.size = strlen(from) + 1;
to.str = new char[to.size];
}
strcpy(to.str, from);
return to;
}
足够简单。但是 std::string 的运算符>>真的让我很好奇。
从根本上说,实现看起来像这样(忽略流和字符串都是模板的事实):
std::istream& operator>> (std::istream& in, std::string& value) {
std::istream::sentry cerberos(in);
if (cerberos) {
value.erase();
std::istreambuf_iterator<char> it(in), end;
if (it != end) {
std::ctype<char> const& ctype(std::use_facet<std::ctype<char> >(in.getloc()));
std::back_insert_iterator<std::string> to(value);
std::streamsize n(0), width(in.width()? in.width(): std::string::max_size());
for (; it != end && n != width && !ctype.is(std::ctype_base::space, *it); ++it, ++to) {
*to = *it;
}
}
}
else {
in.setstate(std::ios_base::failbit);
}
return in;
}
一个合理的实现可能会使用一种算法,该算法将逐段处理流缓冲区缓冲区的内容,例如,避免重复检查和调用is()
(尽管对于std::ctype<char>
它实际上只是将掩码应用于数组的元素)。无论如何,输入运算符都不会对分配内存感到困惑:一个典型的情况"不是我的工作"。
我相信
它必须使用某种智能内存分配管理。如果你熟悉c,你会看到函数realloc
。我的想法是,stl 中的大多数容器类在内部使用某种形式的 realloc 为自己分配更多内存。
为了回答你的问题,字符串类是从另一个类typedef
的:std::basic_string<char>
它基本上是一个字符数组。因此,它在内部具有保留的内存,可以根据用户的偏好或需求而增长或缩小。就像我之前提到的,这种内存管理是以最佳和安全的方式完成的,因此信息不会丢失。
如果我要实现std::cin >> std::string
它将采用 for 循环的形式,该循环遍历 char 数组并为数组中的每个字符分配一个值
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>
- std::map<std::set, double> AND std:<long>map< std::p air<long, long>, double>
- 如何获取std::vector<DMatch>