我的班级是这样的:
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
答案 0 :(得分:5)
您可以使用count
函数,该函数返回multimap
中带有给定键的条目数。在您的示例中,编写
outgoing.count("str1")
会产生值2.
在C ++中,无法迭代multimap
中的唯一键。如果您想迭代这些键,您可能需要考虑两个选项:
您可以从使用multimap< string, string >
更改为map<string, vector<string> >
。这样,每个键都是唯一的,只需查看相应vector
中的元素数量,即可轻松确定与每个键关联的值。
您可以使用顶级循环迭代所有键,然后使用内部循环跳过重复键。
作为选项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的第一个和最后一个元素共享一个键。
// 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;
}