我怎样才能根据其值的属性进行排序的地图?(How can I sort a map accordin

2019-10-20 07:34发布

我创建具有一个向量如下地图:

map<int,vector<int>> mymap;

我怎样才能根据 n通过地图包含矢量的值进行排序此地图?

Answer 1:

你不能。 你可以提供一个自定义的比较,使基础数据整理得到另一种方式比默认的,但这只涉及到的键 ,而不是 。 如果你有你的容器的元素在某些特定的,值定义为存在的需求,那么你使用了错误的容器。

您可以切换到set ,走的事实,没有高低贵贱有“关键”和“价值”之间的优势,破解底层分拣自己:

template <std::size_t N>
struct MyComparator
{
   typedef std::pair<int, std::vector<int>> value_type;
   bool operator()(const value_type& lhs, const value_type& rhs)
   {
      return lhs.second.at(N) < rhs.second.at(N);
   }
};

/**
 * A set of (int, int{2,}) pairs, sorted by the 2nd element in
 * the 2nd item of each pair.
 */
std::set<std::pair<int, std::vector<int>>, MyComparator<1>> my_data;

int main()
{
    my_data.insert(std::make_pair(1, std::vector<int>{0,5,0,0}));
    my_data.insert(std::make_pair(2, std::vector<int>{0,2,0,0}));
    my_data.insert(std::make_pair(3, std::vector<int>{0,1,0,0}));
    my_data.insert(std::make_pair(4, std::vector<int>{0,9,0,0}));

    for (const auto& el : my_data)
        std::cout << el.first << ' ';
}

// Output: 3 2 1 4

( 现场演示 )

然而,如果你仍然需要执行的键查找,以及 ,那么你在你真的遇到麻烦,需要重新考虑一些事情。 您可能需要复制数据或提供索引向量。



Answer 2:

map<int,vector<int>> mymap;

我怎样才能根据地图包含的矢量的第n个值排序此地图?

如果你准备使用 n值作为整数键也一样,在始终如一地分配是唯一可能的:

mymap[v[n - 1]] = v;

如果你这样做,你可能会考虑一set<vector<int>> ,其中删除了“关键”部件的冗余存储-那么你就需要提供,虽然自定义比较....

如果你设想采取的是不具有排序,然后排序其元素现有人口地图 - 那是完全不可能的。 你必须复制到另一个容器中的元素,如set多数民众赞成下令在第n 元素或vector ,你std::sort填充后。



Answer 3:

如果我理解正确的,你可以(建)元素添加到地图下面的方式

std::vector<int> v = { 1, 2, 3 };
std::vector<int>::size_type n = 2;

mymap[v[n]] = v;

下面是一个例子

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <cstdlib>
#include <ctime>

int main() 
{
    std::srand( ( unsigned )time( 0 ) );
    const size_t N = 10;
    std::map<int, std::vector<int>> m;

    for ( size_t i = 0; i < N; i++ )
    {
        std::vector<int> v( N );
        std::generate( v.begin(), v.end(), []{ return std::rand() % N; } );
        m[v[0]] = v;
    }

    for ( auto &p : m )
    {
        for ( int x : p.second ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

输出是

0 1 7 8 1 2 9 0 0 9 
1 6 3 1 3 5 0 3 1 5 
3 8 0 0 0 7 1 2 9 7 
5 9 5 0 7 1 2 0 6 3 
6 4 7 5 4 0 0 4 2 0 
7 9 8 6 5 5 9 9 4 5 
8 3 8 0 5 9 6 6 8 3 
9 5 4 7 4 0 3 5 1 9 

考虑到,因为有可复制的载体(即是有n个元素的值相同(在我的例子n等于0),那么一些矢量不会被添加到地图上。如果你想拥有重复,那么你应该例如使用std::multimap

您也可以根据基于一个存在地图上的标准,建立一个新的地图。



Answer 4:

你可以滥用C ++映射使用其关键字排序树的事实。 这意味着,你可以创建一个新的地图,以作为键进行排序你希望它的价值,但你也可以创建一个vector以自己的地图中的项目的引用,以及那种载体(或周围的其他方法:你可以有一个排序的载体,并使用map上创建您的向量索引)。 请务必使用一个multimap在重复键的情况。



文章来源: How can I sort a map according to a property of its values?
标签: c++ vector map