考虑以下代码:
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;
};
std::queue
的前面插入吗?我认为一旦你从前面弹出它,只能用 push()
将其放回到后面。 - Jason队列不是处理这种类型事情的正确对象。你应该使用优先队列或自定义队列包装一个链表,以允许你执行此类操作。STL的队列实现要求你只能访问前面和后面的元素,访问任何其他元素都需要删除最前面的元素和所需元素之间的所有对象。因此,为了比较对象并查看应该删除哪些对象,需要大费周折地取出一堆临时对象,然后再将它们推回去。
另一方面,优先队列已经在内部排序,因此前面和后面的对象要么是队列中最大和最小的对象,要么反之。中间的所有其他对象也会被排序。因此,当你从队列的前面弹出元素时,它们会按照递增或递减的顺序出现,具体取决于你初始化优先队列时使用的比较函数。
你可以在这里阅读有关使用优先队列的更多信息。
我认为算法大致如下:
基本上是遍历整个队列,但只将与前一个元素比较有利的元素推回。
3,1,2
,那么2
的“前一个学生”是什么?是1
,这样2
就会保留,还是3
,这样2
就会被删除? - MSalters