我有一个带有整数(x)和列表(列表)的多图。
std::map<int,std::list<int> > my_map;
假设mylist1由元素100,200,300组成,我将其映射到整数1
mylist2由元素99,199,299组成,我将其映射到整数2
my_map.insert(pair<int,std::list<int> > (1, mylist1));
my_map.insert(pair<int,std::list<int> > (2, mylist2));
现在给一个元素说200,我怎么能返回值1(说元素200属于 到映射到整数元素1的列表?
答案 0 :(得分:4)
您应该使用列表的元素作为键,使用整数作为值。 举个例子:
std::multimap<int, int> my_map;
my_map.insert(std::make_pair(100, 1));
my_map.insert(std::make_pair(200, 1));
my_map.insert(std::make_pair(300, 1));
my_map.insert(std::make_pair(99, 2));
my_map.insert(std::make_pair(199, 2));
my_map.insert(std::make_pair(299, 2));
然后只使用std::multimap<int,int>::equal_range
函数
答案 1 :(得分:1)
正如@NirMH所说 - 迭代地图时出现了什么问题? 我假设您使用的是C ++ 98标准编译器。以下是您的简单代码(http://rextester.com/WVBE96570):
#include <iostream>
#include <map>
#include <list>
#include <algorithm>
int main()
{
std::map<int, std::list<int> > my_map;
std::list<int> l1;
l1.push_back(10);
l1.push_back(20);
std::list<int> l2;
l2.push_back(30);
l2.push_back(40);
my_map[1] = l1;
my_map[2] = l2;
int value_to_find = 40;
int list_index = -1;
for(std::map<int, std::list<int> >::const_iterator p_int_list_pair = my_map.begin(),
end = my_map.end(); p_int_list_pair != end; ++p_int_list_pair)
{
const int& curr_index = p_int_list_pair->first;
const std::list<int>& curr_list = p_int_list_pair->second;
std::list<int>::const_iterator curr_list_end = curr_list.end();
if(std::find(curr_list.begin(), curr_list_end, value_to_find) != curr_list_end)
{
list_index = curr_index;
break;
}
}
std::cout << list_index;
}
答案 2 :(得分:0)
伪码:
Iterate over my_map
For every iteration, search the value (list<int>) for your target integer
If found, return the my_map iterator first item
您可以使用find
标题中的algorithm
方法优化搜索。
答案 3 :(得分:0)
这是我的C ++ 11对它的看法:
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
#include <utility>
using value_type = int;
using list_type = ::std::list<value_type>;
using key_type = int;
using map_type = ::std::map<key_type, list_type>;
using pair_type = map_type::value_type;
list_type my_list_1;
list_type my_list_2;
map_type my_map;
map_type::const_iterator find_key_of_first_list_containing (const value_type x, const map_type & map)
{
auto map_cend = map.cend();
for (auto map_cit = map.cbegin(); map_cit != map_cend; ++map_cit)
{
auto list = map_cit->second;
auto list_cend = list.cend();
auto list_cit = ::std::find(list.cbegin(), list_cend, x);
if (list_cit != list_cend)
return map_cit;
}
return map_cend;
}
int main (int, char **)
{
my_list_1.push_back(100);
my_list_1.push_back(200);
my_list_1.push_back(300);
my_list_2.push_back(99);
my_list_2.push_back(199);
my_list_2.push_back(299);
my_map.insert(pair_type(1, my_list_1));
my_map.insert(pair_type(2, my_list_2));
auto i = find_key_of_first_list_containing(200, my_map);
if (i != my_map.end())
::std::cout << "Found at: " << i->first << "\n";
else
::std::cout << "Not found!\n";
return 0;
}