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

Using an Algorithm library operation in a vector array C++

本文关键字:算法 操作 数组 C++      更新时间:2023-10-16

是否可以在向量数组中使用算法库操作?如果是这样,我应该怎么做,我可以在这里使用什么操作(例如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++;
}
} 

编辑:代码错误类型

用标准库算法替换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());

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