私は自分自身に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;
}
結果として、
**it
ポインタクラスオブジェクトの値を示しました
*it
住所を表示
&it
it
オブジェクトのアドレスを示した
それで、イテレータオブジェクト(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]
コメントを追加