Есть ли эквивалент .at () для мультикарты?

0

Есть ли способ получить итератор для мультимапа, для определенных ключей? Например:

multimap<string,int> tmp;
tmp.insert(pair<string,int>("Yes", 1));
tmp.insert(pair<string,int>("Yes", 3));
tmp.insert(pair<string,int>("No", 5));
tmp.insert(pair<string,int>("Maybe", 1));
tmp.insert(pair<string,int>("Yes", 2));

multimap<string,int>::iterator it = tmp.at("Yes);

Тогда я мог бы использовать it для работы, которую я хочу сделать. Возможно ли это в C++? Или нам нужно просто перебирать мультимап, элемент за элементом и проверять ключ перед выполнением работы?

  • 0
    Я думаю, что вы ищете std::multimap<>::equal_range , но это трудно понять из вашего описания.
Теги:
iterator
multimap
map

2 ответа

2
Лучший ответ

multimap<Key, T> только сортирует элементы по своему Key, поэтому мы можем найти только все элементы, значение ключа которых равно "Yes", а затем каждый элемент поочередно проверяем каждый элемент.

typedef multimap<string,int>::iterator Iterator;
pair<Iterator, Iterator> iter_range = tmp.equal_range("Yes");
Iterator it;
for (it = iter_range.first; it != iter_range.second; ++it) {
    if (it->second == 3) {
        break;
    }
}
if (it != tmp.end()) {
    tmp.erase(it);
}

На самом деле лучше использовать multiset<T> в этом случае:

multiset< pair<string, int> > temp;
temp.insert(make_pair("Yes", 1));
temp.insert(make_pair("Yes", 3));
multiset< pair<string, int> >::iterator iter = temp.find(make_pair("Yes", 1));
if (iter != temp.end()) {
    temp.erase(iter); // it erase at most one element
}
temp.erase(make_pair("Yes", 3)); // it deletes all the elements that equal to make_pair("Yes", 3)
4

Вы найдете одну пару значений ключа (любое совпадение с ключом) или equal_range, чтобы получить все пары, соответствующие данному ключу (это, по-видимому, лучший выбор).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню