【问题标题】:map<string, object> sort according to object member function valuemap<string, object> 按对象成员函数值排序
【发布时间】:2014-11-04 18:15:58
【问题描述】:

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

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

如果真正的程序员对我的代码有一些反馈,我也很高兴,我不是专业人士,但我喜欢并喜欢编程!

【问题讨论】:

  • std::map&lt;std::string, boost::flat_set&lt;Electrons&gt;&gt;
  • 顺便说一句,在 tarball 中提供代码非常不方便。使用 ideone.com 或其他允许我们查看和测试它的平台,而无需从互联网上的陌生人那里下载随机文件。
  • 没有下载任何 tarball 听起来你正在尝试使用错误的工具来完成这项工作。 std::map 仅在插入时调用 operator &lt;。当重载operator &lt;时,你需要提供一个一致的实现,即如果a b在时间t,那么a必须是b在时间t + n。
  • 我的恶意代码传播计划失败了!顺便说一句,我不知道 ideone.com,谢谢,下次我会使用它!感谢安德烈亚斯的解释,我现在明白了。我可以简单地在将矢量插入地图之前对其进行排序,我想这是最简单的方法!

标签: c++


【解决方案1】:

如果你想强制对 map 中的元素进行排序,那么最简单的(从编写最少代码的角度来看)可能只是覆盖 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 没有提供虚拟析构函数,因此不应继承它。所以不要创建一个动态初始化为my_mapstd::map&lt;...&gt;*。或者,您可以让my_map 拥有一个std::map&lt;...&gt; 成员并做同样的事情——但这需要更多的输入,并且基本上复制整个界面。我会这样做。

注意:我没有覆盖operator[]。所以不要用它来插入。

【讨论】:

  • 谢谢@Barry 我想我会先订购vector,然后再将其插入map。我知道在这种情况下实际上不可能重载operator &lt;,因为map 是在插入时订购的,因此我基本上必须将其写入vector of pairssort 并反转为@ 987654334@!
猜你喜欢
  • 2021-05-09
  • 2021-03-26
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多