是否有一种简单或标准的方法来使用多图迭代器迭代多图中的唯一键?
即对于一个看起来像的集合:{1, "a"}, {1, "lemon"}, {2, "peacock"}, {3, "angel"}
一个迭代器,它会在{1, "a"}然后开始递增,指向{2, "peacock"}然后再次递增会指向{3, "angel"}?
给定multimap<A,B>M什么是vector<B>用特定键在M中创建所有值的简洁方法.
例如,给定一个multimap我如何获得映射到值123的所有字符串的向量?
一个答案很简单,从较低循环>上限,但有一个整洁的无环路的方法是什么?
我有std::multimap<string, MyObject*> dataMap;密钥的位置MyObject.name,所有MyObjects都存储在一个std::vector<MyObject>.
在填充地图后,我需要打印dataMap由相同键分组的内容,其中我首先需要相同键的数量,dataMap.count(MyObject.name)然后使用此键的所有值.
我正在考虑使用两个for loops,其中第一个循环遍历"密钥组名称"并计算属于该组的所有密钥,另一个for loop循环遍历特定组中的所有密钥并打印MyObject.information
for(//iterate through group key names){
//print number of key occurences
for(//iterate through a certain group{
//print MyObject.information for all the keys in a group
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我真的不知道如何实现这个,或者我将如何使用迭代器来实现我的意愿.有任何想法吗?
编辑:从提供的链接我创建了这个
for(std::multimap<string, MyObject*>::const_iterator itUnq = dataMap.cbegin();
itUnq != dataMap.cend(); itUnq = dataMap.upper_bound(itUnq->first)){
std::cout << dataMap.count(itUnq->second->name)
<< std::endl;
std::pair <std::multimap<string, MyObject*>::const_iterator,
std::multimap<string, MyObject*>::const_iterator> groupRange;
groupRange = dataMap.equal_range(itUnq->second->code);
//iterate through keys inside the …Run Code Online (Sandbox Code Playgroud) 我的班级是这样的:
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)
{
???????
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
背景:
我想表示一个可以有很多节点的图表.密钥不会重复,但可以有多个值.
str1 ----> val1
str1 ----> val2
str2 -----> val3
Run Code Online (Sandbox Code Playgroud)
我想知道如何获取特定键的值的数量?例如在上面的问题中,对于str1,它将是2?
正如你所看到的,我试图做一些事情,经过一些挖掘,但徒劳无功.
我的代码出了什么问题?
谢谢
编辑:::在templatetypedef的评论之后,我将代码编辑为:
for (it = outgoing.begin();it != outgoing.end();++it)
{
cout<< (*it).first << " "<< outgoing.count((*it).first);
}
Run Code Online (Sandbox Code Playgroud)
我可以得到计数,但键("str1")来了两次.所以我看到的答案是2 2 1. …
有没有什么好方法可以实现以下所需的输出,而无需删除相同的值或创建另一个列表/向量等?我试图将在不同文档中找到的单词映射到他们的文档名称,如所需的输出中所示.
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <sstream>
using namespace std;
multimap<string,string> inverts;
multimap<string,string>::iterator mit;
multimap<string,string>::iterator rit;
pair<multimap<string,string>::iterator,multimap<string,string>::iterator> ret;
int main(int argc, char* argv[])
{
ifstream infile;
for(int i=1;i<argc;i++)
{
char* fname=argv[i];
char line[1024];
string buff;
infile.open(fname);
while(infile.getline(line,1024))
{
stringstream ss(line);
while(ss >> buff)
inverts.insert(pair<string,string>(buff,fname));
}
infile.close();
}
for(mit=inverts.begin();mit!=inverts.end();mit++)
{
string first=(*mit).first;
cout<<first;
ret=inverts.equal_range(first);
for(rit=ret.first;rit!=ret.second;rit++)
cout<<" "<<(*rit).second;
cout<<endl;
}
return 0;
Run Code Online (Sandbox Code Playgroud)
}
Output is:
> ./a.out A B
cat A
dog A B
dog A B
fox …Run Code Online (Sandbox Code Playgroud) 我知道之前有人问过这个问题:
但答案是:
pair<Iter, Iter> range = my_multimap.equal_range("Group1");
int total = accumulate(range.first, range.second, 0);
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我不会为我编译:
pair<multimap<int32_t, float>::iterator, multimap<int32_t, float>::iterator> range = multimap.equal_range(an_int);
float total = accumulate(range.first, range.second, 0);
Run Code Online (Sandbox Code Playgroud)
这是在GCC 4.8上
任何人都可以确认他们是否可以编译这个/提供正确的答案?