C++ -- 如何从 STL 容器中删除具有这种有效条件的元素
C++ -- How to remove the element with such a condition efficient from a STL container?
给定以下代码,
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
是不可能的。然而,它可以处理像deque
、list
、set
或vector
这样的序列(任何有begin()
和end()
的东西)。
如果你想用queue
来做,这样做:
- 从队列中删除第一个元素(使用
pop
)。 - 将分数与队列中新的第一个元素进行比较(使用
front
访问第一个元素)。 - 如果分数较大,请在后面再次插入元素(使用
push
),否则将其丢弃。
再次 - 从 1 开始,直到您再次在前面看到第一个元素。
若要确保不会对任何元素进行两次处理,可以在循环中执行此操作,该循环最多计算到队列的原始大小。
我认为算法如下所示:
- 获取队列的当前大小,将其称为 N。
- pop 1 元素,称之为 Prev
- 推送上一页
- 重复N-1次
- 流行元素,称之为 Cur
- 如果 Cur>= 上一页,则推送 Cur
- 设置上一个 = 库尔
基本上在整个队列中轮换,但只推回与前一个队列相比有利的元素。
队列
不是这类事情的正确对象。 您应该使用优先级队列或包装链接列表的自定义队列,以允许您执行此类操作。 STL 的队列实现要求您仅访问前端和后端元素,而访问任何其他元素需要从队列中删除最前面的元素和所需元素之前的任何对象。 因此,拉出一堆临时对象,然后将它们推回去会很麻烦,以便比较对象并查看应该删除哪些对象。
另一方面,优先级队列已经在内部排序,因此前端和背面对象将是队列中最大和最小的对象,反之亦然。 介于两者之间的所有其他对象也将进行排序。 因此,当您从队列前面弹出元素时,它们将按递增或递减的顺序出现,具体取决于您初始化优先级队列的比较函数。
您可以在 cplusplus.com 阅读有关使用优先级队列的信息。
相关文章:
- 调整大小后指向元素值的指针unordered_map有效?
- 如何有效地收集给定数组中的重复元素?
- 找到对称矩阵的最大元素的最有效算法是什么
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 是否有更有效的方法来检查元素是否在给定的区间内
- 将__m256的奇怪元素提取到__m128中的有效(在锐龙上)方法?
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- 调整大小后保持对矢量元素的引用有效
- 如何有效地在OpenCV Mat和GpuMat上进行元素处理?
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?
- C++:检查向量中的元素是否大于另一个具有相同索引的元素的有效方法?
- 如何有效地从C++集中删除开始和结束元素
- 有效地检查映射 c++ 中是否存在元素
- 从另一个向量中搜索和找到元素的有效方法
- 使用元素加载 std::queue<uint8_t*> 的更有效方法?
- 如何有效地找到数字流中元素的等级
- C++中数组范围内的有效元素计数
- 检查简化迭代器是否指向有效元素