c++ - std::cin >> std::string 是如何实现的?

标签 c++ string std cin stdstring

特别是,代码如何检查字符的内存是否应该重新分配?或者用户输入了多少个字符? 如果我想将 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 的 operator>> 真的让我很好奇。

最佳答案

从根本上说,实现看起来像这样(忽略流和字符串都是模板的事实):

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++ - std::cin >> std::string 是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19530051/

相关文章:

c++ - 字符串比较返回值(用于对字符进行排序的应用程序吗?)

c++ - 变体 bstr 到 std::string 转换的默认编码

c++ - C++ 中的 std::map 内部是什么数据结构?

c++ - 在 C++ 中访问私有(private)成员数据?

java - 使用 String.replace() 替换斜杠即 "\"

c++ - undefined symbol _EVP_PKEY_CTX_new_id

java - java中使用的技术使字符串不可变?

c++ - std::map 的高效线程同步技术

已知大小typedefed数组的c++函数模板特化

c++ - 为什么在 Gradient Noise Generator 中从 Mersenne twister 切换到其他 PRNG 会产生不好的结果?