4

有什么更好的(更干净、更易读和/或更高效)的方法:

std::list<Fruit*>   Apples;
std::list<Fruit>    Basket;

for (std::list<Fruit*>::iterator niApple(Apples.begin());
     niApple != Apples.end(); niApple++) {

    for (std::list<Fruit>::iterator niBasket(Basket.begin());
         niBasket != Basket.end(); niBasket++) {

        if (&(*niBasket) == *niApple) {
            Basket.erase(niBasket);
            break;
        }

    } // loop

} // loop

你会推荐什么?我主要需要将放置在篮子内的苹果手柄,以便从篮子中取出苹果而无需搜索(例如,通过固定数组内的索引)。但是,篮子需要在进程中分配和释放内存。

4

2 回答 2

7

另一种 C++11 方式:

list<Fruit*> Apples;
list<Fruit>  Basket;

Basket.remove_if([](const Fruit& fruit) {
    return any_of(Apples.begin(), Apples.end(), [](Fruit* apple) {
        return &fruit == apple;
    });
});

现在将第一个容器更改为将迭代器保存到第二个容器:

list<list<Fruit>::iterator> Apples;
list<Fruit>  Basket;

for (auto apple : Apples)
    Basket.erase(apple);

通过这种方式,您可以获得更好的性能并且对界面几乎没有更改,因为迭代器在大多数情况下表现得像指针。

也看看这个:std::list 应该被弃用吗?

请注意,要使这两种解决方案都能正常工作,Basket容器必须是std::list.

于 2013-05-10T01:55:26.577 回答
4
std::list<Fruit*>   Apples;
std::list<Fruit>    Basket;

auto is_apple = [](const Fruit& frt) { 
        for(auto apl: Apples) { //for each Apple pointer
            if (apl== &frt) //if it points at the current fruit
                return true; //then it's one of the apples
        }
        return false; //otherwise it's not one of the apples
    };
Basket.remove_if(is_apple);

这对我来说似乎更简单。(万岁 C++11!)

于 2013-05-10T00:47:14.670 回答