gpt4 book ai didi

C++——如何从 STL 容器中有效地删除具有这种条件的元素?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:02 25 4
gpt4 key购买 nike

给定以下代码,

struct Student
{
int score;
}

queue<Student> stdQueue;

如果学生的分数低于前一个学生,我想从列表中删除学生。如何高效地做到这一点?

例如

S1(100) <= S2(55) <= S3(200) <= S4(4) <= S6(1000)

获取

S1 (100) <= S3(200) <= S6(1000)

最佳答案

您可以编写自定义谓词并使用 remove_if。谓词可以是一个仿函数,它总是存储前一个 Studentscore。像这样:

class ScoreLessThanPrevious {
public:
ScoreLessThanPrevious()
: isFirst(true),
previousScore(0)
{}

bool operator()(const Student & s) {
if (isFirst) {
isFirst = false;
return false;
}
else {
boolean retval = s.score < previousScore;
previousScore = s.score;
return retval;
}
}
private:
bool isFirst;
int previousScore;
};

正如 Neil 所指出的,这对于 std::queue 是不可能的。但是,它可以处理 dequelistsetvector 等序列(任何具有 开始()结束())。

如果你想用queue来做,像这样做:

  1. 从队列中移除第一个元素(使用 pop)。
  2. 将分数与队列中新的第一个元素进行比较(使用 front 访问第一个元素)。
  3. 如果得分更大,则在后面再次插入该元素(使用push),否则丢弃它。
  4. 再次从 1. 开始,直到第一个元素再次出现在前面。

为确保您不会处理任何元素两次,您可以在一个循环中执行此操作,该循环计数到队列的原始大小。

关于C++——如何从 STL 容器中有效地删除具有这种条件的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com