【问题标题】:Iterate on a container with two different lexicographical ordering迭代具有两种不同字典顺序的容器
【发布时间】:2015-04-29 23:08:55
【问题描述】:

我有一个容器(set、vector、vector 等,但实际上我有兴趣设置)其中每个元素都是 std::pair(例如,它也可能是 boost::tuple) ,有没有一种简单的方法可以用两种不同的字典顺序迭代这个容器?

即我的情况是:

std::set<std::pair<int,int> > a;
a.push_back(std::pair(1,3));
a.push_back(std::pair(2,3));
a.push_back(std::pair(4,2));
a.push_back(std::pair(5,2));
a.push_back(std::pair(1,5));

我希望能够以这种方式迭代集合(这是简单的部分):

(1,3)
(1,5)
(2,3)
(4,2)
(5,2)

另外一种方式,在pair上使用倒置的字典顺序:

(4,2)
(5,2)
(2,3)
(1,3)
(1,5)

【问题讨论】:

标签: c++ iterator set containers


【解决方案1】:

你不能直接。您可以按照 Wintermute 的建议使用魔法 Boost.MultiIndex,或者手动操作。也就是说,如果你对set、vector或list感兴趣,这些都是排序容器,你可以按照你的主要顺序来排序。

然后,您生成一个根据您的二级顺序排序的二级索引。您可以使用任何容器(例如一组指向您的元素的指针)对其进行自动排序。但是由于您必须明确地管理添加和删除,您也可以简单地使用一个动态指针数组,您将在每次修改后释放并重新创建它。

【讨论】:

    【解决方案2】:

    编辑:抱歉,我没有正确阅读问题。

    基本上,一旦创建容器,排序顺序就会被硬编码到其中。

    唯一的方法是使用另一个容器或这些泰勒制造的魔法增强容器来支持它。

    【讨论】:

    • 如何将比较函子与 std::for_each 一起使用?
    【解决方案3】:

    您不能直接使用来自 STL 的已排序容器(如 std::set)来执行此操作。比较函数对象是在定义容器时设置的,以后不能更改。

    要解决此问题,您可以使用直接支持此功能的容器(例如 Wintermute 提到的来自 Boost 的容器),也可以使用矢量或列表等序列容器,并在迭代之前使用适当的比较函数对其进行手动排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-25
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2019-01-30
      • 2021-02-20
      • 1970-01-01
      相关资源
      最近更新 更多