[英]finding element in map with list c++
我有一个带有整数(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的列表?
您应该使用列表中的元素作为键,并使用整数作为值。 给出您的示例:
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
函数
正如@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;
}
伪代码:
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
您可以使用algorithm
标头中的find
方法来优化搜索。
这是我的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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.