在向量数组C ++中使用算法库操作

问题描述 投票:0回答:1

是否可以在向量数组中使用Algorithm库操作?如果是这样,我应该怎么做?在这里可以使用什么操作(例如remove_if)?目前,我正在运行一个for循环来计算我是否击中某个对象的分数检查,如果被击中则将其删除。一切都很好,但是我不知何故需要在这里使用算法库。 (在C ++中我还是很新的)到目前为止,这是我所拥有的:

std::vector<Coin*>coins;
coins.push_back(new Coin(&window_object[0], 60.0f, 60.0f, 350.0f, 425.0f, "res/coin.png"));
coins.push_back(new Coin(&window_object[0], 60.0f, 60.0f, 450.0f, 425.0f, "res/coin.png"));

...

for (size_t i = 0; i < coins.size(); i++) {
    if (coins[i]->CheckCollect(player)) {
        Coin* temp = coins[i];
        coins.erase(coins.begin()+i);
        delete temp;
        score++;
    }
} 

编辑:代码丢失类型

c++
1个回答
-1
投票

用标准库算法替换for循环并不难。您正在遍历向量,进行一些工作,并可能擦除一些元素。可以用std::remove_if完成。

我将循环体移动到一个lambda表达式中,然后在erase/remove_if中使用了它:

auto my_predicate = [&](Coin *coin) {
    if (coin->CheckCollect(player)) {
        delete coin;
        score++;
        return true; // remove this element
    }
    return false; // don't remove
};

coins.erase(std::remove_if(coins.begin(), coins.end(), my_predicate), coins.end());

我不知道它是否是更干净的代码,但是它可能会更好。重复调用forerase循环可能会很昂贵,因为元素会多次移动以填充孔。使用std::remove_if,每个元素最多可以移动一次,并且只有一个erase可以固定向量大小。

© www.soinside.com 2019 - 2024. All rights reserved.