以下是我的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 >() );
答案 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
已经支持您需要的那种比较。