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

时间:2016-04-30 18:17:59

标签: c++ c++11

我正在尝试使用map ...

在cpp中编写程序

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

如果密钥相同,我们可以使用map来避免重复密钥。为了允许重复密钥,我们使用multimaps

如果值相同,我们如何避免?

我编写的程序允许重复值

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;
}

3 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是维护单独的std::set值。将值插入集合时,它将返回std::pair<iterator, bool>。如果值尚未在集合中,则bool值为true。这告诉您是否将值放在地图中是否安全。

但是,首先,您需要确保key是唯一的,因为可能已经使用不同的值插入了相同的key

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

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

    int key;
    string value;
    int count;

    // keep track of values with a std::set
    std::set<std::string> values;

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

        auto found = map.find(key);

        if(found != map.end()) // key already in map
            continue; // don't add it again

        // now try to add it to the set
        // only add to the map if its value is not already in the set
        if(values.insert(value).second)
            map.insert(std::make_pair(key, value));
    }

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

答案 1 :(得分:2)

do it的一种(低效)方式是创建一个反向地图(使用<string,int>)并将输入与MyMap的输入相反地插入其中。< / strong>如果确定,则插入MyMap
这是工作代码。

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

typedef std::map<string, int> rev_Map;
int main()
{
    MyMap map;
    rev_Map rmap;

    MyMap::iterator mpIter;
    rev_Map::iterator rmap_iter;

    int key;
    string value;
    int count;

    for(count = 0; count < 3;count++)
    {

            cin >> key;
            cin >> value;

            std::pair<rev_Map::iterator, bool> ok = rmap.insert(std::make_pair(value,key)); //insert into the reverse map

            if(ok.second) //if above amap.insert works

                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;
}

答案 2 :(得分:2)

使值成为键的一部分和/或使用一组但可能无法真正解决问题。如果这是您想要的,那么就不可能轻松定义具有唯一键和值的容器。但是,您仍然可以构建一个。这是一个非常简单的例子来说明需要:

FILE *proxy_log_file;

static void
SIGUSR1_handler(int sig)
{
    (void)sig;
    fflush(proxy_log_file);
}

int
main(int argc, char **argv)
{
    proxy_log_file = fopen("proxy.log", "a");
    Signal(SIGUSR1, SIGUSR1_handler);
}

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

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