如何迭代/计算多重映射<string,string> </string,string>

时间:2011-09-15 01:08:58

标签: c++ stl map multimap

我的班级是这样的:

class Outgoing
{
    multimap<string,string> outgoing;

    public:
    void makeConnection(string key, string value)
    {
        outgoing.insert(pair<string,string>(key,value));
    }

    void iterate()
    {
        multimap<string, string>::iterator it;
        multimap<string, string>::iterator it2;
        pair<multimap<string,string>::iterator,multimap<string,string>::iterator> ret;
        for (it = outgoing.begin();it != outgoing.end();++it)
        {
            ret = outgoing.equal_range((*it));  ??????
            for (it2=ret.first; it2!=ret.second; ++it2)
            {
                ???????

             }
        }
    }
};

背景:

我想表示一个可以包含许多节点的图表。密钥不会重复,但可以有多个值。

str1  ----> val1
str1  ----> val2
str2 -----> val3

我想知道如何获取特定键的值的数量?例如在上面的问题中,对于str1,它将是2?

正如你所看到的,我试图在经过一些挖掘之后做些事但是徒劳无功。

我的代码出了什么问题?

感谢

编辑:::在templatetypedef的评论之后,我将代码编辑为:

for (it = outgoing.begin();it != outgoing.end();++it)
{
    cout<< (*it).first << " "<<  outgoing.count((*it).first); 

}

我可以得到计数,但是键(“str1”)来了两次。所以我看到的答案是2 2 1。

我非常感激,如果有人教我如何以这样的方式迭代我只得到一把钥匙。顺便说一句,谢谢,templatetypedef

2 个答案:

答案 0 :(得分:5)

您可以使用count函数,该函数返回multimap中带有给定键的条目数。在您的示例中,编写

outgoing.count("str1")

会产生值2.

在C ++中,无法迭代multimap中的唯一键。如果您想迭代这些键,您可能需要考虑两个选项:

  1. 您可以从使用multimap< string, string >更改为map<string, vector<string> >。这样,每个键都是唯一的,只需查看相应vector中的元素数量,即可轻松确定与每个键关联的值。

  2. 您可以使用顶级循环迭代所有键,然后使用内部循环跳过重复键。

  3. 作为选项2的示例,您可以尝试这样的事情:

    for (multimap<string, string>::iterator itr = myMap.begin(); itr != myMap.end(); ) {
        /* ... process *itr ... */
    
        /* Now, go skip to the first entry with a new key. */
        multimap<string, string>::iterator curr = itr;
        while (itr != myMap.end() && itr->first == curr->first)
            ++itr;
    }
    

    希望这有帮助!

答案 1 :(得分:2)

函数equal_range提供了一对迭代器,map的第一个和最后一个元素共享一个键。

revised jsFiddle

// multimap::equal_range
#include <iostream>
#include <map>

int main ()
{
  std::multimap<char,int> mymm;

  mymm.insert(std::pair<char,int>('a',10));
  mymm.insert(std::pair<char,int>('b',20));
  mymm.insert(std::pair<char,int>('b',30));
  mymm.insert(std::pair<char,int>('b',40));
  mymm.insert(std::pair<char,int>('c',50));
  mymm.insert(std::pair<char,int>('c',60));
  mymm.insert(std::pair<char,int>('d',60));

  std::cout << "mymm contains:\n";
  for (char ch='a'; ch<='d'; ch++)
  {
    std::pair <std::multimap<char,int>::iterator, std::multimap<char,int>::iterator> ret;
    ret = mymm.equal_range(ch);
    std::cout << ch << " =>";
    for (std::multimap<char,int>::iterator it=ret.first; it!=ret.second; ++it)
      std::cout << ' ' << it->second;
    std::cout << '\n';
  }

  return 0;
}