对具有两种不同字典排序的容器进行迭代

Iterate on a container with two different lexicographical ordering

本文关键字:迭代 排序 字典 两种      更新时间:2023-10-16

我有一个容器(setvectorvector等,但实际上我很感兴趣设置),其中每个元素都是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)

另一种方式是,在对上使用反向字典排序:

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

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

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

编辑:对不起,我没有正确阅读这个问题。

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

唯一的方法是使用另一个容器或泰勒制造的这些神奇的助推容器来支持它。

您不能直接使用。你可以按照Wintermute的建议使用魔法Boost.MultiIndex,或者手动。这意味着,当您对setvectorlist感兴趣时,这些都是经过排序的容器,您可以根据主顺序对其进行排序。

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