使用list c ++在map中查找元素

时间:2014-07-27 11:54:29

标签: c++ list map stl multimap

我有一个带有整数(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的列表?

4 个答案:

答案 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;
}