我试图重载我编写的类的大于运算符(类似于我面对的真实案例)来对类成员映射进行排序。
在这里,我用我的代码制作了一个tar球:
http://s000.tinyupload.com/?file_id=81335448529630428273
在MapSorting
课程中有
std::map<std::string, std::vector<Electrons> > m_mymap;
我有兴趣使用Electron::pt()
成员函数按顺序对地图进行排序,这样,如果我这样做
std::vector<Electrons> veto_electrons = m_mymap["Veto"];
然后veto_electrons[0]
始终是最高pt
的电子。
我可能会写一个函子来完成这项工作,但是,主要是作为一个练习,我想尽可能重载operator <
。
从真正的程序员那里得到一些关于我的代码的反馈也很高兴,我不是专业人士,但我喜欢并喜欢编程!
答案 0 :(得分:2)
如果要强制对地图中的元素进行排序,那么最简单的(从编写最少量的代码透视图)可能只是覆盖map中的插入方法而只是使用它:
class my_map
: public std::map<std::string, std::vector<Electrons>
{
// whatever constructors you need here
std::pair<iterator, bool>
insert(value_type vt)
{
// make sure the vector<Electrons> is sorted!
std::sort(vt.second.begin(), vt.second.end(),
[](const Electrons& a, const Electrons& b){
return a.pt() > b.pt();
});
// then insert it
return std::map<std::string, std::vector<Electrons>>::insert(vt);
}
};
现在,很多人可能会考虑这种“不良做法”,因为std::map
不提供虚拟析构函数,因此不应继承它。因此,请不要将std::map<...>*
动态初始化为my_map
。或者,您可以让my_map
拥有std::map<...>
成员并执行相同的操作 - 但这需要更多的输入并基本上复制整个界面。我会这样做。
注意:我没有覆盖operator[]
。所以不要用它来插入。