【问题标题】:How to iterate/count for a multimap<string,string>如何迭代/计数 multimap<string,string>
【发布时间】:2011-09-15 01:08:58
【问题描述】:

我的课是这样的:

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?

如您所见,经过一番挖掘后,我尝试做某事,但徒劳无功。

我的代码有什么问题?

谢谢

EDIT ::: 在templatetypedef的注释之后,我将代码编辑为:

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

}

我可以得到计数,但是 key("str1") 出现了两次。所以我看到的答案是 2 2 1。

如果有人教我如何以这样一种方式进行迭代,我将非常感激,我只得到一个密钥。顺便说一句,谢谢,templatetypedef

【问题讨论】:

标签: c++ stl map multimap


【解决方案1】:

您可以为此使用count 函数,该函数使用给定键返回multimap 中的条目数。在你的例子中,写作

outgoing.count("str1")

将产生值 2。

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

  1. 您可以从使用multimap&lt; string, string &gt; 更改为map&lt;string, vector&lt;string&gt; &gt;。这样一来,每个键都是唯一的,您只需查看对应的vector 中的元素数量即可轻松确定每个键关联了多少值。

  2. 您可以有一个顶级循环来遍历所有键,然后有一个内部循环来跳过重复的键。

作为选项 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;
}

希望这会有所帮助!

【讨论】:

  • 快速提问,为什么要回滚删除“fluff”的编辑?
  • @Sam 我习惯用“希望这有帮助!”来结束我的所有答案,所以我想我会保持一致性。 :-)
  • 也许你应该在for循环声明中使用upper_bound();而不是自己循环
【解决方案2】:

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

http://www.cplusplus.com/reference/map/multimap/equal_range/

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

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 2018-01-06
    • 2013-12-18
    • 2015-12-05
    • 2019-01-30
    • 2019-11-02
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多