我有一个简单的 map 程序。它以一个类为关键。该类有多个成员。我认为我的比较功能是正确的。我正在遵循严格的弱命令。问题是,它允许输入重复的密钥。

下面是我的代码。

#include <iostream>
#include <string.h>
#include <map>

class mapkey
{
public:
    std::string mInterface;
    std::string mDestination;
    int         mPrefixLen;
    std::string mNextHop;
    int         mMetric;

    mapkey() {}
   ~mapkey() {}
    mapkey(std::string a, std::string b, int c, std::string d, int e)
    {
      mInterface = a;
      mDestination = b;
      mPrefixLen = c;
      mNextHop = d;
      mMetric = e;
    }
};

struct mapcomp
{
  bool operator() (const mapkey left, const mapkey right);
};

bool mapcomp::operator() (const mapkey left, const mapkey right)
{
  if(strcmp(left.mInterface.c_str(), right.mInterface.c_str()) < 0)
    return true;
  if(strcmp(left.mInterface.c_str(), right.mInterface.c_str()) > 0)
    return false;

  if(strcmp(left.mDestination.c_str(), right.mDestination.c_str()) < 0)
    return true;
  if(strcmp(left.mDestination.c_str(), right.mDestination.c_str()) > 0)
    return false;

  if(strcmp(left.mNextHop.c_str(), right.mNextHop.c_str()) < 0)
    return true;
  if(strcmp(left.mNextHop.c_str(), right.mNextHop.c_str()) > 0)
    return false;

  if(left.mPrefixLen < right.mPrefixLen)
    return true;
  if(left.mPrefixLen > right.mPrefixLen)
    return false;

  if(left.mMetric < right.mMetric)
    return true;
  if(left.mMetric > right.mMetric)
    return false;
}

typedef std::map<mapkey, std::string, mapcomp> script_map;
script_map mm;

void print_map()
{
   script_map::const_iterator iter;
   for (iter = mm.begin(); iter != mm.end(); iter++)
   {
     std::cout << "value is - " << iter->second << std::endl;
   }
}

int main()
{
   mapkey test1("eth1", "50.60.70.80", 1, "90.10.20.30", 1);
   mm[test1] = "first";

   mapkey test2("eth1", "50.60.70.40", 1, "90.10.20.30", 1);
   mm[test2] = "second";

   mapkey test3("eth1", "50.60.70.20", 1, "90.10.20.30", 1);
   mm[test3] = "third";

   mapkey test4("eth1", "50.60.70.80", 1, "90.10.20.30", 1);
   mm[test4] = "fourth";

   print_map();

   return 0;
}

在上面的程序中,第一和第四键相同。当我打印 map 时,输出如下

g++ --std = c++ 11 map.cpp

./a.out

值是-第三

值是-秒

值是-第四

值是-第一

我想念什么?第四项应该没有被添加。

最佳答案

原因:您的比较功能已损坏。

解决方案:使用惯用的C++编写新的解决方案。

struct mapcomp
{
  bool operator() (mapkey const& l, mapkey const& r) {
      return
           std::tie(l.mInterface, l.mDestination, l.mPrefixLen, l.mNextHop, l.mMetric)
           <
           std::tie(r.mInterface, r.mDestination, r.mPrefixLen, r.mNextHop, r.mMetric)
      ;
  }
};
  • 我传递mapkey const&而不是mapkey以避免复制。
  • 我使用元组比较和std::tie从您的成员中删除元组。

  • 您还应该从mapkey中删除所有构造函数和析构函数。鉴于您可以通过通用初始化来初始化成员,因此它们没有任何作用。

    我还考虑将结构更改为类的operator<(甚至是operator==)重载。 map在不通过任何其他比较器的情况下接受它就足够了。

    关于c++ - 以类别为键的 map 允许重复的键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33104941/

    10-11 22:08