3

特に、char のメモリを再割り当てする必要があるかどうかをコードはどのようにチェックしますか? または、ユーザーが入力した文字数は? 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>ます。これは基本的に文字の配列です。内部的には、ユーザーの好みやニーズに応じて拡大または縮小できるメモリが予約されています。そして、前に述べたように、このメモリ管理は、情報が失われないように最適かつ安全な方法で行われます。

実装std::cin >> std::stringする場合は、char の配列を反復処理し、配列内の各文字に値を割り当てる for ループの形式になります。

于 2013-10-22T23:37:24.787 に答える