6

Как проверить, существует ли заданный ключ в std::map?

1

Я пытаюсь проверить, содержится ли заданный ключ в карте, но не могу этого сделать:

typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f"); // Не уверен, делает ли equal_range то, что мне нужно
cout << p.first; // Здесь возникает ошибка

Как я могу вывести содержимое переменной p?

5 ответ(ов)

1

C++20 предоставляет нам метод std::map::contains, который позволяет проверить наличие элемента в std::map легко и понятно.

Вот пример использования:

#include <iostream>
#include <string>
#include <map>

int main()
{
    std::map<int, std::string> example = {{1, "One"}, {2, "Two"}, 
                                     {3, "Three"}, {42, "Don't Panic!!!"}};

    if(example.contains(42)) {
        std::cout << "Found\n";
    } else {
        std::cout << "Not found\n";
    }
}

В этом коде мы создаем std::map с несколькими значениями. С помощью метода contains проверяем, существует ли ключ 42. Если он есть, выводим "Found", в противном случае — "Not found". Это делает код более чистым и читаемым по сравнению с предыдущими методами проверки присутствия элемента в ассоциативных контейнерах.

0

Вы можете использовать метод .find():

map<string,string>::iterator i = m.find("f");

if (i == m.end()) { /* Не найдено */ }
else { /* Найдено, i->first это f, i->second это ++-- */ }

Этот код позволяет вам проверить наличие ключа "f" в карте m. Если ключ не найден, итератор i будет равен m.end(). В противном случае, вы можете получить ключ и соответствующее значение с помощью i->first и i->second.

0

Если вы хотите проверить наличие элемента в ассоциативном контейнере std::map, вместо использования метода find, вы можете воспользоваться методом count. Если m.find возвращает m.end(), это означает, что элемент не найден.

Вот пример кода на C++:

if (m.count("f") > 0) {
    cout << "f is an element of m.\n";
} else {
    cout << "f is not an element of m.\n";
}

Таким образом, m.count("f") > 0 возвращает true, если элемент с ключом "f" присутствует в контейнере, и false в противном случае.

0

Я думаю, вы хотите использовать map::find. Если m.find("f") равен m.end(), значит, ключ не найден. В противном случае find возвращает итератор, указывающий на найденный элемент.

Ошибка возникает из-за того, что p.first — это итератор, который не подходит для вставки в поток. Измените вашу последнюю строку на cout << (p.first)->first;. p — это пара итераторов, p.first — итератор, а p.first->first — это строка ключа.

Помните, что в map может быть только один элемент для данного ключа, поэтому equal_range не очень полезен. Этот метод определён для map, так как он определён для всех ассоциативных контейнеров, но он гораздо более интересен для multimap.

0

В вашем вопросе показан код для работы с std::map<string, string> в C++. Вы можете использовать различные подходы для проверки существования ключа в мапе и последующего доступа к его значению.

Для проверки существования ключа и получения количества его вхождений, можно использовать метод count:

int num = m.count("f");  
if (num > 0) {    
    // найден
} else {  
    // не найден  
}

Этот способ вернет количество вхождений ключа "f" в мапе. Для std::map этот метод будет возвращать 1, если ключ существует, и 0, если его нет.

Другой способ — это использование метода find, который возвращает итератор, указывающий на элемент с заданным ключом:

map<string, string>::iterator mi = m.find("f");  
if (mi != m.end()) {  
    // найден
    // делаем что-то с mi
} else {  
    // не найден  
}  

Этот метод предпочтителен, если вам нужно не только проверить существование ключа, но и получить доступ к его значению.

Что касается вашей ошибки, она вызвана неправильной перегрузкой оператора <<. Поскольку p.first является объектом типа map<string, string>, вы не можете напрямую его вывести. Вместо этого попробуйте следующий код:

if (p.first != p.second) {
    cout << p.first->first << " " << p.first->second << endl;
}

Этот фрагмент кода корректно извлекает и выводит ключ и значение. Не забудьте убедиться, что вы обращаетесь к элементам мапы правильно, в зависимости от структуры, с которой вы работаете.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь