c++ - 如何为包含映射的结构编写比较运算符?

标签 c++ dictionary

我有这样的结构:

   struct MyStruct
    {

    char *name;
    map<char*,char*> mymap;//assume that this map insert data in increasing order
    };

我有另一张 map :

    map<MyStruct,int,Compare> mTest;

    //compare function for less then operator
    struct Compare
    : public std::binary_function<MyStruct, MyStruct, bool>
    {
        bool operator()(const MyStruct &a, const MyStruct&b)
        {
            if(strcmp(a.name,b.name)< 0)
                return true;
            else if(strcmp(a.name,b.name)==0)
            {
                //How should I compare map `mymap` ??
            }
            return false;
        }
    }

那么我应该如何为 mymap 编写比较?

这基本上就是我想要的:

如果

两个映射相等
  1. 名称相同

  2. 他们的 map 大小相等

  3. 那么 map 的内容应该相等,即它们的键和值。

最佳答案

您可以通过多种方式订购 map 。必须考虑三件事:映射的大小、键和值。由于映射本身已经按键排序,因此比较键后的值是很自然的。因此,给定两个相同大小的 map ,只有键才是重要的。我将使用整数键和值作为一个更简单的示例:

 map1: 1->42       map2: 5->16     map3: 1->44   map4: 1->42
       2-> 5             6->16           2->67         2-> 7
       7-> 8             7-> 8           3->10         7-> 8

现在,比较 map1 和 map2 很容易:map1 的第一个键低于 map2 的第一个键,因此 map1 应该在前。
比较 map1 和 map3 在第一个条目中给出相同的键,但是 map1 对应的值较低,因此 map1 再次排在第一位。
比较 map1 和 map4 发现第一个键值对完全相同,但是比较第二对发现 map1 排在第一位,因为它的值又低了。

按大小排序又是微不足道的。尺寸较小的 map 排在尺寸较大的 map 之前。

现在完全取决于您,是先按大小排序还是先按键/值排序。 考虑一张额外的 map :

map5: 5->16
      7-> 3

map5 的大小是 2,map1 的大小是 3。所以如果你先按大小排序,map5 在 map1 之前。如果先比较元素,则 map1 在 map5 之前,因为第一个元素较低。

此比较已在 C++ 中可用:std::pair提供一个 operator<首先比较键,然后比较值。一般来说,元素集合的逐元素比较是通过 std::lexicographical_compare 完成的。 .此外,std::map提供一个 operator<为你做字典比较。它首先比较元素,其次比较大小。

但是,在您的情况下,因为您使用的是 char* s 而不是 C++ 的 string s,你必须为 pair<char*, char*> 编写自己的比较器这是你的 map 的元素。我建议一起使用字符串,它变得非常简单,因为 std::string提供一个 operator< :

struct MyStruct
{
  string name;
  map<string, string> mymap;
};


map<MyStruct,int,Compare> mTest;

//compare function for less then operator
struct Compare
{
  bool operator()(const MyStruct &a, const MyStruct&b)
  {
    return a.name < b.name //name first
      || (a.name == b.name && cmp(a.mymap, b.mymap));
  }

  bool cmp(map<string, string> const& lhs, map<string, string> const& rhs)
  {
    return lhs.size() < rhs.size() //size first
      || (lhs.size() == rhs.size() && lhs < rhs); 
  }
};

关于c++ - 如何为包含映射的结构编写比较运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22501250/

相关文章:

c++ - 通过输出参数返回结果,c++编码标准

c++ - 共享内存 IPC 同步(无锁)

c++ - 在opencv中找到相位相关矩阵中的所有峰

hadoop - 如何选择${mapred.local.dir}?

javascript - 将 Map 转换为 JavaScript 对象

python - 从python中的字典列表中删除字典

python - 如何按字母顺序键排序字典

c++ - gmock : Returns distinct values on each mock invocation

c++ - 初始化未给定的构造函数参数,如何?

c# - 元组(或数组)作为 C# 中的字典键