c++ - 是否有适合度假的标准容器?

标签 c++ sorting dictionary vector containers

我正在寻找一个容器,它可以很好地根据外部值进行排序。因此,例如,假设我的元素是:pair<char, int>这对 key 不是唯一的。比方说我有:

  • 'a' , 0
  • 'j' , 13
  • 'm' , 42
  • 'z' , 100

我想根据接近 char foo 来维护此容器的排序,这可能会改变,此时我需要对容器进行“动态排序”。例如,假设 foo开始为 'm'我希望这些元素按顺序排序。

  • 'm' , 42
  • 'j' , 13
  • 'a' , 0
  • 'z' , 100

现在foo更改为 'i'我需要在这个容器上调用 resort 来获取订单:

  • 'j' , 13
  • 'a' , 0
  • 'm' , 42
  • 'z' , 100

我知道我可以用 vector 做到这一点.那是我最好的选择吗?我真的在寻找类似 map 的东西但由于排序不一致,我不能使用它。

最佳答案

要对相对于 X 的内容进行排序,从排序列表开始,只需找到“X”在列表中的位置即可。

现在合并(如在 std::merge 中)“X 之后”和“X 之前,向后”的两个范围。

提高效率的诀窍是不要实际移动任何东西。将“排序”应用为惰性或包装操作。

具体如何操作取决于您需要的操作。如果您正在编写优先级队列,您可能会使用 std::map 并天真地插入东西。

然后要找到最低元素,使用下限/上限并比较(最多)两个候选元素以查看哪个元素“更低”。

这会给你 O(lg n) pop 最低。

如果您需要按该顺序迭代,则必须编写“合并前向范围”。 “合并前向范围”拥有两个前向迭代器范围和一个比较函数对象;它的迭代器是前向迭代器,并在每个范围内保留一个迭代器,取消引用和推进操作在“最低”的迭代器上(其中 end 永远不会最低),并且 == 按元素工作。

在容器上前进的时间复杂度为 O(1)。

关于c++ - 是否有适合度假的标准容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54658193/

相关文章:

sorting - Jekyll - 按整数排序页面

python - Python 中日期和时间的格式化和排序

c++ - 使用 std::sort() 和 lambda 函数按属性对 ADT 的 vector 进行排序时遇到问题

python - 在python中使用__getitem__迭代字典

python - 读取文件并将内容插入字典

c++ - 为什么这些 vector 不相等?

c++ - QThread finished() 信号永远不会发出

c++ - 如果没有 endl,则重载 ostream 运算符段错误

c++ - 如何将 `std::chrono::milliseconds` 转换为 `boost::posix_time::milliseconds`

python - xlwt 词典列表