C ++ /イテレータはクラスオブジェクトのセットに対してどのように機能しますか?

ヒロキ

私は自分自身にC ++を教えていて、面白いことを見つけました。

このウェブページによると

イテレータの最も明白な形式はポインタです。

そのため、私は以前、イテレータオブジェクトはポインタとほぼ同じように機能すると考えていました(例int *i)。

ただし、イテレータオブジェクトは、ポインタ(int **i)ではなく、ポインタ(など)のポインタのようなものであると言った方が正確だと思いますint *i

私が次のものをコーディングしていたとき、私はこれに気づきました。

set<Point*, Point> points; //This class encapsulates x and y coordinates for a 2 dimensional point
set<Point*, Point>::iterator it;

int x = 22;
int y = 4;
Point* pt = new Point(x, y);
points.insert(pt);
//Similar statements are here, to insert other Point objects with different arguments

for (it = points.begin(); it != points.end(); it++) {
    cout << "**it: " << **it << ", *it :" << *it << ", Address : " << &it << endl;
}

結果として、

  1. **it ポインタクラスオブジェクトの値を示しました

  2. *it 住所を表示

  3. &ititオブジェクトのアドレスを示した

ここに画像の説明を入力してください

それで、イテレータオブジェクト(it)は基本的に同じであると言うのは正しい**itですか?

イテレータとは少し異なる別の質問:

次のようなクラスオブジェクトのセットを作成する必要set<ClassName*, ClassName> SetName;がある場合、正しい方法は何でしょうか。(このクラスに、intまたはのような同等のデータ型が含まれている限りdouble

アドバイスをいただければ幸いです。

モスクワ出身のヴラド

それは間違った仮定です。あなたの例でvalue_typeは、セットのはポインタPoint *です。そして、*itあなたにこのいくつかのオブジェクトへの参照である集合内の要素与えvalue_type型であるPoint *++itセットで次の要素に「ポイント」。したがって、イテレータはのオブジェクトへのポインタと同じように動作しますvalue_type

このような式を使用すると**it、2番目の逆参照はイテレータに適用されません。セット内のオブジェクトに適用されます。**it次のように表現を想像することができます

Point *pp = *it;

Point p = *pp;

コンテナのイテレータは、コンテナの要素へのアクセスを提供する責任があります。したがって、コンテナ内の要素にタイプがあるvalue_type場合、イテレータはこのvalue_typeのこれらの要素へのアクセスを提供します。要素は、オブジェクトへのポインタ、またはオブジェクトへのポインタへのポインタなどになります。

2番目の質問については、クラスに対応する演算子関数があり、クラス自体に単純なデフォルトコンストラクターがある場合は、そのようなアプローチを使用できますが、separatwコンパレーターを定義するか、単にoperator <クラスのオブジェクトを定義する方がよいでしょう最後の場合、あなたは書くことができます

std::set<Point> s;

明示的な2番目のテンプレート引数なし。

これがあなたのアプローチの実証的なプログラムです

#include <iostream>
#include <set>



int main() 
{
    struct Point
    {
        int x, y;
        bool operator ()( const Point &p1, const Point &p2 ) const
        {
            return p1.x < p2.x && p1.y < p2.y;
        }
    };

    std::set<Point, Point> s;
    s.insert( { 2, 2 } );
    s.insert( { 1, 1 } );

    for ( const Point &p : s ) std::cout << p.x << ' ' << p.y << std::endl;

    return 0;
}

プログラム出力は

1 1
2 2

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#のソートされたセットはカスタムオブジェクトでどのように機能しますか?

分類Dev

C ++コンストラクターはどのようにしてそのクラスのオブジェクトを初期化しますか?

分類Dev

このC ++コンパイラ最適化の名前は何ですか(それ自体のインスタンスでオブジェクト独自のコンストラクタを呼び出す)、そしてそれはどのように機能しますか?

分類Dev

オブジェクトのセットがアクションを実行したかどうかを効率的に判断するためのデザインパターンまたは言語機能(c#)はありますか?

分類Dev

C#ジェネリックを使用してクラスのオブジェクトをタイプTのオブジェクトに変換するにはどうすればよいですか?

分類Dev

RTTIがない場合、C ++では、コレクション内のオブジェクトがインターフェイスを実装しているかどうかを実行時にどのように判断できますか

分類Dev

C ++の自由定理:テンプレートは本質的に無知であり、未知のタイプのオブジェクトに対して中立ですか?

分類Dev

イテレータはC ++のリストでどのように機能しますか?

分類Dev

動的オブジェクトからのキャストはC#でどのように機能しますか

分類Dev

動的オブジェクトからのキャストはC#でどのように機能しますか

分類Dev

私のプライベートメソッドはどのようにしてC ++のパブリック列挙型にアクセスできますか?

分類Dev

C ++のコピーコンストラクターはどのように機能しますか?

分類Dev

デスクトップC#アプリでオブジェクトクラスの名前をルートとして追加するJsonとしてオブジェクトをシリアル化するにはどうすればよいですか?

分類Dev

C ++のCOMオブジェクトから返されたVARIANTデータ型のSAFEARRAYにどのようにアクセスしますか?

分類Dev

Python C APIを使用してオブジェクトのメソッドから定数にアクセスするにはどうすればよいですか?

分類Dev

C#-インターフェイスのセットを実装するオブジェクトを参照する型をどのようにして持つことができますか?

分類Dev

C++ リンク リストのコピーをクラス オブジェクトとして作成するにはどうすればよいですか?

分類Dev

c ++は、メンバーオブジェクトからインスタンス化クラスの他のメンバーにアクセスします

分類Dev

c ++ 11 initializer_listは、埋め込みオブジェクトのリテラル定数値に対して機能しませんか?

分類Dev

移動コンストラクターはC ++でどのように機能しますか?

分類Dev

テンプレートタイプがC ++ 11の特定の基本クラスから派生しているかどうかをエレガントにチェックするにはどうすればよいですか?

分類Dev

C#インターフェイスオブジェクトのリストに特定のオブジェクトが含まれているかどうかを確認するにはどうすればよいですか?

分類Dev

C ++オブジェクトのgdbのすべてのコンストラクターに同時にブレークポイントを設定するにはどうすればよいですか?

分類Dev

Azureb2cでサイレントアクセストークンはどのように機能しますか

分類Dev

最初のオブジェクトが2番目のオブジェクトに必要なインターフェイスを実装している場合にのみ、C#で実行時に2つのオブジェクトを作成するにはどうすればよいですか?

分類Dev

C#ジェネリックはどのように機能しますか?

分類Dev

QMLはC ++オブジェクトをインスタンス化します。それらのメソッドにアクセスするにはどうすればよいですか?

分類Dev

オブジェクトがC ++のテンプレートクラスのインスタンスであるかどうかを確認するにはどうすればよいですか?

分類Dev

C#のメソッド呼び出しでオブジェクトインスタンスを渡すにはどうすればよいですか?

Related 関連記事

  1. 1

    C#のソートされたセットはカスタムオブジェクトでどのように機能しますか?

  2. 2

    C ++コンストラクターはどのようにしてそのクラスのオブジェクトを初期化しますか?

  3. 3

    このC ++コンパイラ最適化の名前は何ですか(それ自体のインスタンスでオブジェクト独自のコンストラクタを呼び出す)、そしてそれはどのように機能しますか?

  4. 4

    オブジェクトのセットがアクションを実行したかどうかを効率的に判断するためのデザインパターンまたは言語機能(c#)はありますか?

  5. 5

    C#ジェネリックを使用してクラスのオブジェクトをタイプTのオブジェクトに変換するにはどうすればよいですか?

  6. 6

    RTTIがない場合、C ++では、コレクション内のオブジェクトがインターフェイスを実装しているかどうかを実行時にどのように判断できますか

  7. 7

    C ++の自由定理:テンプレートは本質的に無知であり、未知のタイプのオブジェクトに対して中立ですか?

  8. 8

    イテレータはC ++のリストでどのように機能しますか?

  9. 9

    動的オブジェクトからのキャストはC#でどのように機能しますか

  10. 10

    動的オブジェクトからのキャストはC#でどのように機能しますか

  11. 11

    私のプライベートメソッドはどのようにしてC ++のパブリック列挙型にアクセスできますか?

  12. 12

    C ++のコピーコンストラクターはどのように機能しますか?

  13. 13

    デスクトップC#アプリでオブジェクトクラスの名前をルートとして追加するJsonとしてオブジェクトをシリアル化するにはどうすればよいですか?

  14. 14

    C ++のCOMオブジェクトから返されたVARIANTデータ型のSAFEARRAYにどのようにアクセスしますか?

  15. 15

    Python C APIを使用してオブジェクトのメソッドから定数にアクセスするにはどうすればよいですか?

  16. 16

    C#-インターフェイスのセットを実装するオブジェクトを参照する型をどのようにして持つことができますか?

  17. 17

    C++ リンク リストのコピーをクラス オブジェクトとして作成するにはどうすればよいですか?

  18. 18

    c ++は、メンバーオブジェクトからインスタンス化クラスの他のメンバーにアクセスします

  19. 19

    c ++ 11 initializer_listは、埋め込みオブジェクトのリテラル定数値に対して機能しませんか?

  20. 20

    移動コンストラクターはC ++でどのように機能しますか?

  21. 21

    テンプレートタイプがC ++ 11の特定の基本クラスから派生しているかどうかをエレガントにチェックするにはどうすればよいですか?

  22. 22

    C#インターフェイスオブジェクトのリストに特定のオブジェクトが含まれているかどうかを確認するにはどうすればよいですか?

  23. 23

    C ++オブジェクトのgdbのすべてのコンストラクターに同時にブレークポイントを設定するにはどうすればよいですか?

  24. 24

    Azureb2cでサイレントアクセストークンはどのように機能しますか

  25. 25

    最初のオブジェクトが2番目のオブジェクトに必要なインターフェイスを実装している場合にのみ、C#で実行時に2つのオブジェクトを作成するにはどうすればよいですか?

  26. 26

    C#ジェネリックはどのように機能しますか?

  27. 27

    QMLはC ++オブジェクトをインスタンス化します。それらのメソッドにアクセスするにはどうすればよいですか?

  28. 28

    オブジェクトがC ++のテンプレートクラスのインスタンスであるかどうかを確認するにはどうすればよいですか?

  29. 29

    C#のメソッド呼び出しでオブジェクトインスタンスを渡すにはどうすればよいですか?

ホットタグ

アーカイブ