C++ 按大小对地图进行排序
我有类似的地图:C++ 按大小对地图进行排序,c++,sorting,map,iterator,C++,Sorting,Map,Iterator,我有类似的地图: map<int, map<int, map<int, int> > > myMap; order-num | id | order-num-of-relation | relation-id ----------------------------------------------------- 0 | 1 | 0 | 2 -----------------------------
map<int, map<int, map<int, int> > > myMap;
order-num | id | order-num-of-relation | relation-id
-----------------------------------------------------
0 | 1 | 0 | 2
-----------------------------------------------------
1 | 2 | 0 | 1
-----------------------------------------------------
| | 1 | 3
-----------------------------------------------------
2 | 3 | 0 | 2
-----------------------------------------------------
11、31、22
我可以使用sort函数并在这里传递自己的排序函数,在这里我可以检查大小并返回true/false,还是我必须编写显式排序算法?您不能/不能对地图进行排序。它们根据模板参数的可选第三个参数按键自动排序,该参数是一个函数对象类,用于比较两个元素以确定哪一个应该首先出现。如果第一个在第二个之前,则返回true,否则返回false 所以你可以用这样的方法:
struct myCompare
{
bool operator() const (const map<int,int> & lhs, const map<int,int> & rhs)
{
return lhs.size() < rhs.size();
}
};
但由于地图是你的价值,而不是你的钥匙,这对你来说并不适用。你不能对地图进行排序。它们根据模板参数的可选第三个参数按键自动排序,该参数是一个函数对象类,用于比较两个元素以确定哪一个应该首先出现。如果第一个在第二个之前,则返回true,否则返回false 所以你可以用这样的方法:
struct myCompare
{
bool operator() const (const map<int,int> & lhs, const map<int,int> & rhs)
{
return lhs.size() < rhs.size();
}
};
但是,由于地图是您的价值,而不是您的钥匙,这对您来说并不完全有效。您所寻找的东西已经在Boost中完成了。这里有一个来自Boost的好例子,告诉你如何使用它来解决你对数据收集的要求以及它们的选择 当然,使用此集合对象也可能会改变存储信息的方式。您将把它放在一个结构中。然而,如果你想把你的信息当作一个数据库,有一个独特的订单规格,这是唯一的方式,我知道如何清洁 另一个选项是在std::map中放置项目时创建自己的排序操作符。因此:
struct Orders{
int order_num;
int id;
int order_num_relation;
int relation_id;
bool operator<(const Orders& _rhs){
if(order_num < _rhs.order_num) return true;
if(order_num == _rhs.order_num){
if( id < _rhs.id) return true;
if( id == _rhs.id){
//and so on, and so on
老实说,这种方式是一种痛苦,并邀请了一个非常容易被忽视的逻辑错误。使用Boost,大部分棘手的事情都会为您解决。您所寻找的东西已经在Boost中完成。这里有一个来自Boost的好例子,告诉你如何使用它来解决你对数据收集的要求以及它们的选择 当然,使用此集合对象也可能会改变存储信息的方式。您将把它放在一个结构中。然而,如果你想把你的信息当作一个数据库,有一个独特的订单规格,这是唯一的方式,我知道如何清洁 另一个选项是在std::map中放置项目时创建自己的排序操作符。因此:
struct Orders{
int order_num;
int id;
int order_num_relation;
int relation_id;
bool operator<(const Orders& _rhs){
if(order_num < _rhs.order_num) return true;
if(order_num == _rhs.order_num){
if( id < _rhs.id) return true;
if( id == _rhs.id){
//and so on, and so on
老实说,这种方式是一种痛苦,并邀请了一个非常容易被忽视的逻辑错误。使用Boost,大部分棘手的问题都会为您解决。为什么这对我不起作用?只需要一些begin->second或类似的东西,或者不需要?它不起作用,因为您无法按值对地图进行排序。也许地图不是你想要的。也许你可以用矢量,意思是:矢量为什么这对我不起作用?只需要一些begin->second或类似的东西,或者不需要?它不起作用,因为您无法按值对地图进行排序。也许地图不是你想要的。也许您可以使用vectorI,意思是:vectoraps是有序的,并且在声明模板时以固定的顺序作为模板的参数。您不能按照不同的顺序对映射进行重新排序,因为您需要将数据移动到不同的容器中,然后在那里进行处理。还要注意的是,映射元素中的键在插入后不能更改。映射是有序的,并且在声明模板时以固定顺序作为模板的参数。您不能按照不同的顺序对映射进行重新排序,因为您需要将数据移动到不同的容器中,然后在那里进行处理。还请注意,插入后无法更改贴图元素中的键。