如何根据其值的属性对地图进行排序?

时间:2014-06-16 10:11:26

标签: c++ vector map

我创建了一个带有矢量的地图,如下所示:

map<int,vector<int>> mymap;

如何根据map中包含的向量的 n th 值对此地图进行排序?

4 个答案:

答案 0 :(得分:2)

您不能。您可以提供自定义比较器,使基础数据的排序方式与默认方式不同,但这仅与相关,而不是< EM>值。如果您要求容器的元素以某种特定的,值定义的顺序存在,那么您使用的是错误的容器。

您可以切换到set,并利用“key”和“value”之间没有区别的事实,并自行破解基础排序:

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

live demo

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

答案 1 :(得分:0)

如果我已经正确理解你可以(构建)以下列方式向地图添加元素

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

您还可以根据现有地图的标准构建新地图。

答案 2 :(得分:0)

  

map<int,vector<int>> mymap;

     

如何根据map包含的向量的第n个值对此地图进行排序?

只有在您准备将n th 值用作整数键时才有可能,如同始终如一地分配:

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

如果您正在执行此操作,则可以考虑set<vector<int>>,这会删除该&#34;密钥&#34;的冗余存储空间。 element - 然后你需要提供自定义比较....

如果您设想拍摄一张没有排序的现有填充地图,那么对其元素进行排序 - 这是完全不可能的。您必须将元素复制到另一个容器,例如在 th 元素上排序的set,或者vector在填充之后你std::sort

答案 3 :(得分:-1)

您可以滥用c ++地图使用按键排序的树的事实。这意味着您可以创建一个新地图,使用您希望对其进行排序的值作为键,但您也可以创建一个vector来引用地图中的项目,并对该矢量进行排序(或反过来说:你可以有一个排序的向量,并使用map在你的向量上创建一个索引)。在重复键的情况下,请务必使用multimap