我想创建一个包含不同字符串的结构,并为每个字符串分配一些(不是唯一的)int值。在我填充了该结构之后,我想检查每个字符串已经分配了多少个不同的int以及它们究竟是哪个。我知道可以通过multimap解决这个问题。但是我不确定是否(或如何)可以将所有不同的字符串包含在multimap中,因为函数“find”需要一个参数进行匹配,而我不知道何时搜索哪些不同的值可能在多重映射。怎么可以用multimap完成?
作为替代解决方案,我尝试使用带矢量作为值的简单地图。但是我仍然无法使这个工作,因为向量的迭代器似乎没有被识别,它表明我:迭代器必须有一个指向类类型的指针。
map<string, vector<int>>::iterator multit;
int candID1, candID2, candID3;
for(multit=Freq.begin(); multit!=Freq.end(); multit++)
{
if((*multit).second.size()==3)
{
vector<int> vectorWithIds = (*multit).second;
for(vector<int>::iterator it = vectorWithIds.begin();
it != vectorWithIds.end();it++)
{
candID1 = it-> Problem: The iterator is not recognized
}
}
}
有人能检测到这个问题吗?无论是第一种还是第二种方式,都有可行的解决方案吗?
答案 0 :(得分:4)
什么是it->
?它是int
s的向量,您可能需要*it
。
P.S。我不得不承认我没有阅读整篇散文。
答案 1 :(得分:1)
我建议multimap<string, int>
。假设我正确地理解了您的要求,并且您拥有&#34; unique&#34;字符串和几个不同的值。您可以使用count(key)
查看密钥的值,equal_range(key)
返回pair<interator, iterator>
,其中第一个迭代器指向键的值范围的开始,第二个迭代器指向键的值。
请参阅reference
答案 2 :(得分:1)
好吧,这完全没有效率,但你可以使用std :: set initialize和std :: vector一起提取std :: vector的唯一值,就像这个例子一样:
#include <iostream>
#include <vector>
#include <map>
#include <set>
int main() {
// some data
std::string keys[] = {"first", "second", "third"};
int values[] = {1, 2, 1, 3, 4, 2, 2, 4, 9};
// initial data structures
std::vector<std::string> words(keys, keys + sizeof(keys) / sizeof(std::string));
std::vector<int> numbers(values, values + sizeof(values) / sizeof(int));
// THE map
std::map< std::string, std::vector<int> > dict;
// inserting data into the map
std::vector<std::string>::iterator itr;
for(itr = words.begin(); itr != words.end(); itr++) {
dict.insert(std::pair< std::string, std::vector<int> > (*itr, numbers));
} // for
// SOLUTION
// count unique values for the key of std::map<std::string, std::vector<int> >
std::map<std::string, std::vector<int> >::iterator mtr;
for(mtr = dict.begin(); mtr != dict.end(); mtr++) {
std::set<int> unique((*mtr).second.begin(), (*mtr).second.end());
std::cout << unique.size() << std::endl;
} // for
return 0;
} // main