2015-01-27 2 views
2
std::map<std::string, std::vector<std::string>> myMap 

Как мы можем узнать, под каким ключом myMap хранится строка '55'?Как узнать, под каким ключом карты хранится заданное значение?

std::vector<string> vec1 = {"11", "22", "33"}; 
std::vector<string> vec2 = {"44", "55"}; 
std::vector<string> vec3 = {}; 

std::string key1 = "1"; 
std::string key2 = "2"; 
std::string key3 = "3"; 

myMap.insert(std::make_pair(key1, vec1)); 
myMap.insert(std::make_pair(key2, vec2)); 
myMap.insert(std::make_pair(key3, vec3)); 
+1

Что делать, если значение доступно в соответствии с 2-мя ключами? Что вы ожидаете от результата? – RedX

+0

Посмотрите на алгоритм std :: find. –

+0

@RedX в текущей конструкции такой случай невозможно. строки уникальны для каждого вектора – cross

ответ

3

Вы можете использовать std::find_if с лямбда перебирать векторы, и std::find выполнить поиск по вектору:

auto lookup = "55"; 
auto it = std::find_if(
    std::begin(myMap), 
    std::end(myMap), 
    [&](const std::map<std::string, std::vector<std::string>>::value_type& p) 
    { 
     return std::find(std::begin(p.second), std::end(p.second), lookup) != std::end(p.second); 
    } 
    ); 

if(it != std::end(myMap)) 
    std::cout << it->first; 

Или с общим лямбда в C++ 14, это уборщик:

auto lookup = "55"; 
auto it = std::find_if(
    std::begin(myMap), 
    std::end(myMap), 
    [&](auto& p) 
    { 
     return std::find(std::begin(p.second), std::end(p.second), lookup) != std::end(p.second); 
    } 
    ); 

Demo

0

Это сделает работу:

std::string findTheKey( 
    const std::map<std::string, std::vector<std::string>> & map, 
    std::string & value) 
{ 
    for (const auto & x : map) 
     for (const auto & y : x.second) 
      if (y == value) 
       return x.first; 
    throw std::runtime_error{ 
     "Could not find a key to the value '" + value + "'."}; 
} 
0

Это работает так:

for (int i = 1; i <= myMap.size(); ++i) 
{ 
    std::string key = std::to_string(i); 
    auto a = std::find(myMap[key].begin(), myMap[key].end(), "55"); 
    if (a != myMap[key].end()) 
    { 
     std::cout << "Value found at key " << key << std::endl; 
    } 
}