【问题标题】:c++ iterate multiple ordered collections of different typesC ++迭代不同类型的多个有序集合
【发布时间】:2023-02-02 23:33:24
【问题描述】:

标准库中是否有任何部分支持以下用例: 您有 N 个集合,每个集合都可能是一种集合(C1、C2 ...、Cn),所有这些集合都支持 begin()end() 和迭代,即(向量、双端队列等)。

这些集合中的每一个都可以包含不同类型的对象,即集合是 C1、C2、C3,并且具有不同的大小。

此外,您可以为每种类型提供一个函数,该函数可以返回一个公共值,该值可用于在类型之间对项目进行排序,即std::function<uint_64(A)>std::function<uint_64(B)>。例如,类型 A 有成员A.timestamp,B 有成员B.TimeStamp,C 有函数C.GetTimestamp()

每个集合都已按此函数排序。

我想做的是使用顺序函数按顺序遍历所有集合中的所有项目,然后调用另一个函数,即访问函数,std::function<void(A &)> 用于 A 的集合,std::function<void(B&)> 用于 B 类型的项目等.

通话顺序为: 首先查看每个集合中第一项的排序函数的返回值。哪一个的值最小,就称它为 visitor 第一项。然后找到其下一项具有最低排序值的集合。在排序功能上的联系,迭代集合中最先出现在集合“集合”中的集合。一旦集合达到“结束”,它就会从迭代中删除。

我正在考虑推出自己的产品,但想知道标准库中是否已经有类似的东西。

【问题讨论】:

  • 可能有一个解决方案,但如果您描述了您想要完成的事情而不是您想要如何实现它,它会有所帮助。

标签: c++ visitor-pattern


【解决方案1】:

标准库中没有对此用例的直接支持。您必须自己实施。

一种方法可能是创建迭代器的优先级队列,其中每个迭代器将代表其中一个集合中的当前位置。然后您将遍历优先级队列,并在每一步中,为迭代器指向的具有最低排序值的项目调用访问函数。如果迭代器到达其集合的末尾,您将从优先级队列中删除它。

您可以使用 std::priority_queue 和 std::tuple 来存储迭代器,并将排序函数返回值用作排序键。您还可以实现自定义比较器来比较订单函数返回的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2015-08-23
    • 2016-02-27
    • 2016-03-22
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多