c++ - 我应该使用哪种 STL 来完成这项任务?

标签 c++ list stack queue

<分区>

我需要一个队列,它必须添加/删除我拥有的一些结构,例如:

struct MyObject
{
  int offset;
  BYTE status, data1, data2;
  double beatPos;

  enum Status
  {
    isOff = 8,
    isOn = 9,
  };
}   

当我 .Add() 一个元素时,由于 beatPos 值,这个队列必须将元素放在正确的位置,它必须从低位开始排序(队列顶部,即我将弹出的下一个元素)到上层(我将从中提取的最后一个元素)。

我看到有 std::priority_queue , 但我不确定是否可以选择哪个字段用于订购。

此外,一旦我在列表中添加了一些结构,我想删除第一个具有(例如)beatPos=1,567 的元素(它可能位于列表的中间,例如;不一定在开头)。

有什么线索吗?

最佳答案

你想要的是一个std::multiset .它采用比较模板参数,默认为 std::less 作为容器要存储的类型,但您可以指定不同的比较器。为此,我们可以创建一个 lambda 来比较两个 MyObject 并根据 beatPos 成员返回哪个对象应该具有更高的优先级

auto my_compare = [](const MyObject & lhs, const MyObject & rhs)
                    {
                        return lhs.beatPos < rhs.beatPos;
                    }

然后我们可以像这样使用它

std::multiset<MyObject, decltype(my_compare)> data(my_compare);

这将为您提供一个有序的容器,可以存储具有相同 beatPos 的多个对象,并允许您访问容器的中间部分。

关于c++ - 我应该使用哪种 STL 来完成这项任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744261/

相关文章:

c++ - 从 C++ 代码创建单独的 QML 窗口

python - 将列表列表和 "distributing"元素从另一个列表获取到子列表的 Pythonic 方法是什么?

c# - 将两个空间对象合并到一个空间中

c++ - 从旋转和位置获取前向 vector

c++ - Qt:是否可以在使用 foreach 宏进行迭代时删除 QList 元素?

arrays - 为什么要双倍堆叠容量而不是仅仅增加固定数量?

stack - 如何确定堆栈底部?

Java - 从文本文件加载二叉树

c++ - 从 WM_CHAR 消息中获取扫描码

json - 使用Gson从JSON字符串转换为数据类对象列表?