如何在保持先前订单的同时对排序的向量进行排序

时间:2015-12-18 22:10:32

标签: c++

我有以下结构

struct Mydate
{
 int  UserId;
 string name;

};
vector<Mydate> v1;

1:按UserId对矢量进行排序

2:按名称对排序后的矢量进行排序,同时保持先前的顺序 例如

v1.push_back(make_pair(100, "d"));
v1.push_back(make_pair(100, "q")); 
v1.push_back(make_pair(102, "m"));
v1.push_back(make_pair(102, "d"));
v1.push_back(make_pair(100, "c"));

(排序函数可以首先用于UserId,但是当我们按名称对它进行排序时,它会覆盖以前的顺序)

我们可以看到以下格式的输出:

(100,c) , (100, d), (100, q), (102,d), (102, m) 

请有人帮助我吗?

4 个答案:

答案 0 :(得分:4)

您可以像这样定义operator<成员函数:

operator<(const Mydate & rhs)
{
    if (UserId < rhs.UserId)
    {
        return true;
    }
    else if (UserId == rhs.UserId)
    {
        if (name < rhs.name)
        {
            return true;
        }
    }
    return false;
}

答案 1 :(得分:3)

您可以为std::sort

定义自己的比较器
vector<Mydate> v1;
// ...
std::sort(v1.begin(), v1.end(), [](Mydate const &a, Mydate const &b) {
    return (a.UserId == b.UserId)? (a.name < b.name) : (a.UserId < b.UserId);});

或者您可以使用std::pair

代替课程
using Mydate = std::pair<int, std::string>;

std::pair按字典顺序进行比较,这是你想要的。然后使用std::sort作为:

std::vector<Mydate> v1;
//...
std::sort(v1.begin(), v1.end());

答案 2 :(得分:3)

看来你的意思是以下

#include <iostream>
#include <string>
#include <vector>
#include <tuple>
#include <algorithm>

struct Mydate
{
    int  UserId;
    std::string name;
};

std::vector<Mydate> v1;

int main()
{
    v1.push_back( { 100, "d" } );
    v1.push_back( { 100, "q" } ); 
    v1.push_back( { 102, "m" } );
    v1.push_back( { 102, "d" } );
    v1.push_back( { 100, "c" } );

    std::sort( v1.begin(), v1.end(),
               []( const Mydate &a, const Mydate &b ) 
               { 
                   return std::tie( a.UserId, a.name ) < std::tie( b.UserId, b.name );
               } );

    for ( const Mydate &item : v1 ) 
    {
        std::cout << item.UserId << '\t' << item.name << std::endl;
    }
}

程序输出

100 c
100 d
100 q
102 d
102 m

答案 3 :(得分:2)

自定义比较器方法是首选方法,但为了完整起见,应提及多种分类方法。有时它可能是首选(通常当您希望能够动态选择排序规则时)。

要按某些属性A对条目进行排序,其中具有相同A的元素将按属性B排序,您需要使用自下而上的方法:先按B排序,然后按A排序,保留等效元素的相对顺序(稳定排序)。

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

struct Mydate
{
    int  UserId;
    std::string name;
};

int main()
{
    std::vector<Mydate> v {{100, "d"}, {100, "q"}, {102, "m"}, {102, "d"}, {100, "c"}};
    std::sort(v.begin(), v.end(),        [](auto& l, auto& r){return l.name   < r.name;});
    std::stable_sort(v.begin(), v.end(), [](auto& l, auto& r){return l.UserId < r.UserId;});
    for(const auto& d: v)
        std::cout << d.UserId << ' ' << d.name << '\n';
}