2014-11-04 130 views
1

我试图重载一个类的大于操作符(类似于我正面临的一个真实情况)来对类成员映射进行排序。map <string,object>根据对象成员函数值排序

在这里,我做了一个焦油球我的代码:

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

'std :: map >' – 2014-11-04 18:18:59

+1

顺便说一句,在tarball中提供代码非常不方便。使用ideone.com或其他平台,可以让我们查看和测试它,而无需从互联网上的陌生人下载随机文件。 – StilesCrisis 2014-11-04 18:35:09

+1

没有下载任何tarball,这听起来像你正在尝试使用错误的工具来完成这项工作。 'std :: map'只在插入时调用'operator <'。当重载'operator <'时,你需要提供一个一致的实现,即如果在时间t时a'<'b',那么在时间t + n时'a'必须是<'b''。 – 2014-11-04 18:57:29

回答

2

如果要强制执行,在地图中的元素进行排序,那么最简单的(从编写代码的角度来看,至少量)可能只是覆盖在地图中插入方法,只是使用它:

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

+0

Thanks @Barry我想我只是在将'vector'插入'map'前先订购'vector'。我的理解是,在这种情况下它实际上不可能重载'operator <'',因为'map'在插入时是有序的,因此我将不得不基本将它写入'pairs of pairs','sort'和reverse到一个“地图”! – drkg4b 2014-11-06 15:00:11

相关问题