鉴于以下代码,
struct Student
{
int score;
}
queue<Student> stdQueue;
Run Code Online (Sandbox Code Playgroud)
如果学生的分数低于前一个,我想从列表中删除学生.如何做到这一点有效?
例如
S1(100) <= S2(55) <= S3(200) <= S4(4) <= S6(1000)
Run Code Online (Sandbox Code Playgroud)
得到
S1 (100) <= S3(200) <= S6(1000)
Run Code Online (Sandbox Code Playgroud)
您可以编写自定义谓词并使用remove_if.谓词可以是一个总是存储score前一个的仿函数Student.像这样的东西:
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;
};
Run Code Online (Sandbox Code Playgroud)
正如尼尔指出的那样,这是不可能的std::queue.它将,但是,与序列工作就像一个deque,list,set或vector(任何有begin()和end()).
如果你想用a queue来做,那就这样做:
pop).front).push),否则丢弃它.要确保不处理任何元素两次,可以在循环中执行此操作,该循环计数到队列的原始大小.