3

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

4

2 回答 2

4

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

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>实际上它只是将掩码应用于数组的元素) . 在任何情况下,输入运算符都不会关心分配内存:典型的情况是“不是我的工作”。

于 2013-10-22T23:39:53.203 回答
0

我相信它必须使用某种智能内存分配管理。如果你熟悉 c,你就会看到函数realloc。我的想法是 stl 中的大多数容器类在内部使用某种形式的 realloc 来为自己分配更多的内存。

为了回答您的问题,字符串类typedef来自另一个类:std::basic_string<char>它基本上是一个 char 数组。因此,它在内部保留了内存,可以根据用户的偏好或需求增长或缩小。就像我之前提到的,这种内存管理是以最佳和安全的方式完成的,这样信息就不会丢失。

如果我要实现std::cin >> std::string它,它将采用 for 循环的形式,该循环遍历 char 数组并为数组中的每个字符分配一个值

于 2013-10-22T23:37:24.787 回答