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++ 错误 : Unhandled exception at 0x00934ABB (linked list, 地址簿)

c++ - 为什么循环停止?

c++ - 创建并编译一个基类以在其他 C++ 项目 (ROS) 中使用

java - 当两者的输出相同时,为什么我的 if/else 语句不匹配?

python 2.7.5+ 拆分列表 ['a' , 'xxx yyy zzz' ] 到列表 ['a' , 'xxx' , 'yyy' , 'zzz' ] 怎么样?

java - 添加范围 {} 括号让变量超出范围是否与调用和结束函数或某种空循环具有相同的效果?

c++ - x86-64 Linux NASM。在 C++ 文件中声明为函数的类型 int 数组的函数参数传递

python - 递归——Python,返回值问题

c++ - 如何获取卷序列号

python - 属性错误: list has no attribute dot