2

同じタイプの別のポインターとともに、ポインターのSTLリストがあります。それぞれに対して大量の操作を実行する必要があります。私の現在の方法は、ポインターをリストにプッシュし、すべてを繰り返し処理してから、ポインターを元に戻すことです。これは問題なく機能しますが、物事の組み合わせを繰り返すためのよりエレガントでハッキーでない方法があるかどうか疑問に思いました。(イテレーションに追加する他の追加のものが山積みになっている場合など)

現在は機能していますが、少しハッキーな方法です。

std::list<myStruct*> myList;
myStruct* otherObject;

//the list is populated and the object assigned

myList.push_back(otherObject);
for(std::list<myStruct*>::iterator iter = myList.begin(); iter != myList.end(); ++iter){

      //Long list of operations

}

myList.pop_back(otherObject);
4

2 に答える 2

3

より慣用的なアプローチは、「操作の長いリスト」を関数にカプセル化し、必要に応じて呼び出すことです。例えば:

void foo (myStruct* x)
{
    // Perform long list of operations on x.
}

...

{
    std::list<myStruct*> myList;
    myStruct* otherObject;

    // The list is populated and the object assigned.

    foo (otherObject);
    for(std::list<myStruct*>::iterator iter = myList.begin(); iter != myList.end(); ++iter)
    {
        foo(*iter);
    }
}

その後、foo他のアイテムに適用する必要がある場合は、必要に応じて電話してください。

otherObjectあなたが説明する方法で追加することについて本質的に悪いことは何もありませんmyListが、それはある意味でリストを悪用しているので、可能であれば避けるべきです。

于 2012-06-18T02:48:08.687 に答える
1
void doStuff( myStruct& object )
{
    //Long list of operations
}

int main()
{
    std::list<myStruct*> myList;
    myStruct* otherObject;

    //the list is populated and the object assigned

    for( auto iter = myList.begin(); iter != myList.end(); ++iter )
    {
        doStuff( **iter );
    }
    doStuff( *otherObject );
}
于 2012-06-18T02:53:01.403 に答える