map <string,object =“”>根据对象成员函数值</string,>进行排序

时间:2014-11-04 18:15:58

标签: c++

我试图重载我编写的类的大于运算符(类似于我面对的真实案例)来对类成员映射进行排序。

在这里,我用我的代码制作了一个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 <

从真正的程序员那里得到一些关于我的代码的反馈也很高兴,我不是专业人士,但我喜欢并喜欢编程!

1 个答案:

答案 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[]。所以不要用它来插入。