我创建了一个带有矢量的地图,如下所示:
map<int,vector<int>> mymap;
如何根据map中包含的向量的 n th 值对此地图进行排序?
答案 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
但是,如果你仍然需要在键上执行查找,那么你真的遇到了麻烦,需要重新考虑一些事情。您可能需要复制数据或提供索引向量。
答案 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
。