Вы можете написать собственный предикат и использовать 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;
};
Как отмечает Нейл, это невозможно с std::queue
.Однако он будет работать с такими последовательностями, как deque
, list
, set
или vector
(все, что имеет begin()
и end()
).
Если вы хотите это сделатьс помощью queue
сделайте это следующим образом:
- Удалите первый элемент из очереди (используя
pop
). - Сравните результат с новым первым элементом вочередь (доступ к первому элементу, используя
front
). - Если счет больше, вставьте элемент снова в конец (используя
push
), в противном случае отмените его. - Снова из1. пока у вас снова не появится первый элемент спереди.
Чтобы убедиться, что вы не обрабатываете ни один элемент дважды, вы можете сделать это в цикле, который подсчитывает исходный размер очереди.