2

C++ Primer 5th を読んでいるときに、次のようなコードに遭遇しました。

    string s("some string");
    if (s.begin() != s.end())
    {
      auto it = s.begin();   
      *it = toupper(*it);
    }

itイテレータから string の最初の文字までの値を受け取りますs。その後、 によって大文字に変更されtoupper()ます。it逆参照できるのはどうしてですか?ポインターではなく、char 型の変数であるべきではありませんか?

4

3 に答える 3

3

itイテレータです:

C++ では、反復子は、要素の範囲 (配列やコンテナーなど) 内の要素を指し、一連の演算子 (少なくともインクリメント (++) および逆参照 (*) 演算子)。

反復子の最も明白な形式はポインターです。ポインターは配列内の要素を指すことができ、インクリメント演算子 (++) を使用してそれらを反復処理できます。しかし、他の形式の反復子が存在します。たとえば、各コンテナー タイプ (ベクターなど) には、その要素を効率的に反復処理するように設計された特定の反復子タイプがあります。

ポインターはイテレーターの形式ですが、すべてのイテレーターがポインターと同じ機能を持っているわけではないことに注意してください。特定のアルゴリズムに対して反復子が持つ必要がある要件を区別するために、5 つの異なる反復子カテゴリが存在します。

イテレーターは、ポインターのように動作するスマート オブジェクトであるため(最初は文字列の先頭を指します。これはcontainerです)、そのコンテナーを反復処理するためit、コード サンプルに示すように、逆参照できます。したがって、一般it にポインターとして使用できます。

あなたの場合、文字列内のポインターの現在の位置は、その位置にあったものと同等の大文字に割り当てられています:

*it = toupper(*it);
于 2013-04-12T00:59:49.757 に答える
0

イテレータ型 (そして、これは魔法のautoキーワードを使用することで隠されているものです) は複雑なものであり、プリミティブ オブジェクトではありません。

を要求すると、その位置の char への参照*itが与えられます。したがって、それを変更できます。

于 2013-04-12T01:00:32.390 に答える
0
    Shouldn't it just be a char type variable and not a pointer?

「それ」はイテレータ(オブジェクトのようなポインタ)であり、ポインタではありません。ポインターよりもイテレーターを選択することには明確な利点があります。顕著な利点の 1 つは、アルゴリズムをコンテナーから分離できることです。したがって、一般的なアルゴリズム (反復子の型によってのみ制約される) を持ち、アルゴリズムからコンテナを分離します。

Plsは STL iterators-purposeを見てください。

于 2013-04-12T01:14:00.840 に答える