簡體   English   中英

如何根據地圖值的屬性對地圖進行排序?

[英]How can I sort a map according to a property of its values?

我創建了一個具有如下矢量的地圖:

map<int,vector<int>> mymap;

如何根據地圖包含的向量的 n 值對該地圖排序?

你不能 您可以提供一個自定義比較器,以使基礎數據以不同於默認值的另一種方式排序,但這僅與鍵有關 ,而與無關。 如果您要求容器的元素以某些特定的,按值定義的順序存在,那么您使用的是錯誤的容器。

您可以切換到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

現場演示

然而,如果你仍然需要執行的鍵查找,以及 ,那么你在你真的遇到麻煩,需要重新考慮一些事情。 您可能需要復制數據或提供索引向量。

如果我已正確理解,則可以通過以下方式(構建)向地圖添加元素

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

您還可以根據基於現有地圖的條件來構建新地圖。

map<int,vector<int>> mymap;

如何根據地圖包含的向量的第n個值對此地圖排序?

僅當您也准備將 n 值用作整數鍵時,這才有可能,如一致地分配:

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

如果這樣做,則可以考慮使用set<vector<int>> ,它刪除了該“鍵”元素的冗余存儲-然后,您需要提供自定義比較。

如果您設想采用現有的,沒有該順序的填充地圖,然后對其元素進行排序-則完全不可能。 你必須復制到另一個容器中的元素,如set多數民眾贊成下令在第n 元素或vector ,你std::sort填充后。

您可能會濫用c ++映射使用按其鍵排序的樹的事實。 這意味着您可以創建一個新的地圖,並以您希望對其進行排序的值作為鍵,但是您也可以創建一個對地圖中各項進行引用的vector ,然后對該矢量進行排序(或者反之:您可以對向量進行排序,並使用map在向量上創建索引)。 請務必使用一個multimap在重復鍵的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM