对列表和单个对象进行C ++迭代

时间:2012-06-18 02:38:34

标签: c++ iteration

我有一个STL指针列表,以及另一个相同类型的指针。我需要对它们进行大量的操作。我当前的方法是将指针推到列表上,遍历所有内容,然后将指针弹回。这很好用,但它让我想知道是否有更优雅/更少的hacky方式来迭代各种事物。 (如果我在迭代中添加了一堆其他额外的东西)

当前的功能,但有点hacky方式:

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);

2 个答案:

答案 0 :(得分: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并没有任何内在的恶意,但它在某种程度上滥用了这个列表,如果可能的话应该可以避免。

答案 1 :(得分: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 );
}