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

鉴于以下代码,

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.谓词可以是一个总是存储前一个学生得分的仿函数.像这样的东西:

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这样的序列(任何有begin()和end()的序列).

如果你想用队列来做,那就这样做:

>从队列中删除第一个元素(使用pop).
>将得分与队列中新的第一个元素进行比较(使用前面访问第一个元素).
>如果分数较高,请在后面再次插入元素(使用推送),否则丢弃它.
>再次从1.直到你再次在前面有第一个元素.

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

转载注明原文:C – 如何从STL容器中删除具有这种条件的元素? - 代码日志