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

q09*_*987 4 c++ stl

鉴于以下代码,

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)

Bjö*_*lex 5

您可以编写自定义谓词并使用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,setvector(任何有begin()end()).

如果你想用a queue来做,那就这样做:

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

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