在C++中对向量的向量进行排序

4

我有以下数据结构:

std::vector<std::pair <std::vector<unsigned>,std::vector<unsigned> > > A;

包含以下数据:
((7),(108,109)),
((3),(100,101)),
((9),(111,112)),
((5),(102,103)),
((8),(110)),
((8,2,10),(189)),
((5,7),(121)),
((3,9),(119)),
((10),(114)),
((3,5),(115)),
((3,7),(118)),
((3,10),(120)),
((3,4,5),(122))

现在我想按以下方式仅对A的向量对中的第一个向量进行排序。例如,我的A向量对中的第一个向量是:

(7),
(3),
(9),
(5),
(8),
(8,2,10),
(5,7),
(3,9),
(10),
(3,5),
(3,7),
(3,10),
(3,4,5)

我希望按照第一个向量对A进行排序,使得最终排序后我的向量变成:

((3),(100,101)),
((5),(102,103)),
((7),(108,109)),
((8),(110)),
((9),(111,112)),
((10),(114)),
((3,5),(115)),
((3,7),(118)),
((3,9),(119)),
((3,10),(120)),
((5,7),(121)),
((3,4,5),(122)),
**((2,8,10),(189)).**

我知道如何使用std:sort对向量进行排序,但不确定如何使用标准c++函数对向量的向量进行排序。我尝试首先按大小进行排序,然后使用bublee sort进行最终排序。是否有其他方法可以使用c++标准库函数来对这些向量进行排序?我在ubuntu 12.04上使用g ++编译器运行C ++(g ++(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3)。


哦,那么很抱歉,我可能误解了“lexicographically”这个词的含义。 - Steg Verner
没问题 - 我只是想确保你的问题清晰明了。你可以对问题进行[编辑],尽管我没有一个很好的术语来描述你所描述的类型。 - Drew Dormann
1个回答

6

基本上,您需要做的是:

  1. 首先按第一个pair<>中的第一个vector的大小进行排序
  2. 然后按字典顺序排序vectors

您必须编写自己的比较函数。

代码:

bool mySort(const pair<vector<unsigned>,vector<unsigned> > &a , const pair<vector<unsigned>,vector<unsigned> > &b)
{
    if (a.first.size() == b.first.size()) {
        //If sizes of the vectors are equal
        //Sort the graph lexicographically. 
        return std::lexicographical_compare(a.first.begin(),a.first.end(),b.first.begin(),b.first.end());pair<vector<unsigned>,vector<unsigned> > a
    } else {
        //Sort by size.
        return a.first.size() < b.first.size();
    }
}
int main()
{
    std::vector<std::pair<std::vector<unsigned>,std::vector<unsigned> > > a;
    std::sort(a.begin(),a.end(),mySort);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接