作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定以下代码,
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
。谓词可以是一个仿函数,它总是存储前一个 Student
的 score
。像这样:
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
是不可能的。但是,它可以处理 deque
、list
、set
或 vector
等序列(任何具有 开始()
和结束()
)。
如果你想用queue
来做,像这样做:
pop
)。front
访问第一个元素)。push
),否则丢弃它。为确保您不会处理任何元素两次,您可以在一个循环中执行此操作,该循环计数到队列的原始大小。
关于C++——如何从 STL 容器中有效地删除具有这种条件的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064295/
我是一名优秀的程序员,十分优秀!