如何使用c避免地图中的重复值

新手上路,请多包涵

我正在尝试使用地图在 C++ 中编写程序…

我的目标是避免在地图中重复相同的值。

如果键相同,我们可以使用映射来避免重复键。为了允许重复键,我们使用多重映射。

如果值相同,我们如何避免这种情况?

我编写的程序允许重复值:

 typedef std::map<int, std::string> MyMap;

int main()
{
    MyMap map;
    MyMap::iterator mpIter;

    int key;
    string value;

    int count;
    for(count = 0; count < 3;count++)
    {
        cin >> key;
        cin >> value;

        std::pair<MyMap::iterator, bool> res = map.insert(std::make_pair(key,value));
    }

    for (mpIter=map.begin(); mpIter != map.end(); ++mpIter)
         cout  << " "  << (*mpIter).second << endl;
}

原文由 udaya chandran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 329
1 个回答

将值作为键的一部分和/或使用集合,但这可能并不能真正解决问题。如果您想要的话,不可能轻松地定义一个同时具有唯一键和值的容器。但是,您仍然可以构建一个。这是一个非常简单的示例来说明需要什么:

 // Assuming keys are KEY and values are VAL

class MyMap  {
public:
   std::set<KEY> keyset;
   std::set<VAL> valset;

   std::map<KEY,VAL> theRealMap;

   // assuming existence of  function HAS(S,V)
   // which returns true if v is in set S
   bool MyInsert(KEY ky, VAL val) {
       if (HAS(keyset,  ky) return false;
       if (HAS(valset, val) return false;
       keyset.insert(ky);
       valset.insert(vl);
       return theRealMap.insert(std::pair<KEY,VAL>(ky, val));
   }
:
:

由于这是一个示例,因此不打算复制。您可能希望包含 std:map 提供的功能。一种简单的方法是将 std::map 用作基类,但您需要隐藏(通过设为私有)或为每个 insert 变体实现类似的代码,否则您可能会无意中插入可能不是唯一的。

注意:这需要两倍于单个地图的大小。您可以通过使用 RealMap 而不是单独设置键集来节省一些空间。另一种方法是搜索地图,但这会牺牲时间换空间。这是你的电话。

原文由 DAV 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题