如何通过第一个和第二个参数对std :: map进行排序?

时间:2011-08-17 12:19:16

标签: sorting map

以下是我的std::map示例,例如std::map< string, string > my_map;

//   ABC | aaa      ABC | aaa
//   DEF | def      ABC | dcd
//   BCD | def  ->  ABC | zzz
//   DEF | bcd      BCD | def
//   ABC | dcd      DEF | bcd
//   ABC | zzz      DEF | def

正如您所看到的,我正在尝试对左std::map进行排序并获得正确的结果。

这是我的代码(我不使用字符串,但我的自定义类型。无论如何,最后,我正在排序字符串):

template < typename T1, typename T2 >
struct less_second
{
     typedef std::pair< T1, T2 > type;
     bool operator ()( type const& _left, type const& _right ) const
     {
          return ( (*_left.first).name() < (*_right.first).name() ) &&
                 ( (*_left.second).name() < (*_right.second).name() );
     }
};

问题:仅在less_second

中使用时
return (*_left.first).name() < (*_right.first).name();

来自第一个列的所有数据已排序,但第二列未排序(当然,因为我们仅使用第一个!)

镜像情况,当我只使用

return (*_left.second).name() < (*_right.second).name();

第二个列已排序。

但是我需要立即排序第一列和第二列。如何编码?我做错了什么?

感谢您的帮助!


抱歉,忘了这段代码:

std::vector< std::pair< CompanyPtr, ContractorPtr > > n_map_( buddies_ccm_.begin(), buddies_ccm_.end() );
std::sort( n_map_.begin(), n_map_.end(), less_second< CompanyPtr, ContractorPtr >() );

4 个答案:

答案 0 :(得分:1)

我对术语“列”感到有点困惑。你在谈论关键和价值观吗?

std :: map始终按键排序。您可以在地图的构造时指定比较对象以定义该顺序。但是这个比较对象不会比较std::pair s,而是映射关键字类型的对象。

此外,地图中的键是唯一的。因此,地图中不能有两个带有“ABC”键的条目。

我想您尝试使用std::sort中的<algorithm>对地图进行排序。我不确定在这种情况下会发生什么,但我认为这不是你期望发生的事情。

答案 1 :(得分:1)

您的比较功能有误。当两个first.name()相等时,它不起作用。尝试这样的事情:

 bool operator ()( type const& _left, type const& _right ) const
 {
     if ((*_left.first).name() > (*_right.first).name())
        return false;
     if ((*_left.first).name() < (*_right.first).name())
        return true;
     return ( (*_left.second).name() < (*_right.second).name() );
 }

答案 2 :(得分:0)

如果_left->first_right->first相等,您只想考虑第二列。换句话说,您希望首先将代码与first字段进行比较,然后仅在second比较不确定时(first比较两个first字段)进行比较。 1}} s相等)。

答案 3 :(得分:0)

你无法用std::map达到你想要的效果,因为它已经在另一个答案中解释过了。如果你的对没有重复,你可以使用一组对:

std::set<std::pair<std::string, std::string> > pair_set;

您不需要提供比较器,std::pair已经支持您需要的那种比较。