2
        list<CPoint> l;

        l.push_back( CPoint(1,2) );
        l.push_back( CPoint(30,40) );
        l.push_back( CPoint(4,6) );
        l.push_back( CPoint(70,80) );

        CPoint * point = 0;

        for ( list<CPoint>::iterator iter = l.begin();
                iter != l.end();
                iter++)
        {
            cout << iter->x << " , "  << iter->y << endl;

            // compilation error, I can't typcast it like below?
            point  = (CPoint *) iter;
        }

上記の問題はiter、ループ内を実際のデータ構造ポインターにどのようにタイプキャストするかということです。そうすれば、控えめに言っても、 のpoint.xようなコードを書くことができます。point.y

上記は私が書いたデモコードですが、実際には検索機能にこのコードがあります。リストにアイテムが見つかった場合、そのアイテムへのポインターが返されます。それ以外の場合は NULL になります。そのポインタを元に戻すには、イテレータを元のデータ構造ポインタに逆参照する必要がありますが、どうすればよいでしょうか? ありがとう。

4

1 に答える 1

3

構文エラーを修正するには、イテレータを逆参照してから、下のオブジェクトからアドレスを取得する必要があります。

point  =  &*iter;

std::find/std::find_ifを使用して、std::list から返されたイテレータを格納することをお勧めします。

auto it = std::find_if(l.begin(), l.end(), 
                       [](const CPoint& cp) { return cp.x == 1 && cp.y == 2; } );

if (it != l.end()) // test iterator to see is desired CPoint is found
{
    std::cout << (*it).x << " " << (*it).y << std::endl;
}
于 2013-10-06T06:29:33.877 に答える