7

私のクラスは次のようなものです:

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

}

カウントは取得できますが、キー("str1")が2回来ます。したがって、私が見る答えは 2 2 1 です。

キーが 1 つしか得られないように反復する方法を誰かが教えてくれたら、とてもありがたいです。ところで、ありがとう、templatetypedef

4

2 に答える 2

6

このための関数を使用できます。この関数は、指定されたキーを持つcountのエントリ数を返します。multimapあなたの例では、

outgoing.count("str1")

値2が生成されます。

C ++では、内の一意のキーだけを反復処理する方法はありませんmultimap。これらのキーだけを反復処理する場合は、次の2つのオプションを検討する必要があります。

  1. multimap< string, string >の使用からに変更できますmap<string, vector<string> >。このように、各キーは一意であり、対応するの要素の数を確認するだけで、各キーに関連付けられている値の数を簡単に判断できます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;
}

お役に立てれば!

于 2011-09-15T01:13:20.897 に答える
5

関数 equal_range は、マップの最初と最後の要素が特定のキーを共有する、反復子のペアを提供します。

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;
}
于 2016-04-16T21:14:01.337 に答える