multmap equal_range в C++
Этот пример для использования equal_range
предлагается на сайте cplusplus.com:
int main ()
{
std::multimap<char,int> mymm;
mymm.insert(std::pair<char,int>('a',10));
mymm.insert(std::pair<char,int>('b',20));
mymm.insert(std::pair<char,int>('b',30));
mymm.insert(std::pair<char,int>('b',40));
mymm.insert(std::pair<char,int>('c',50));
mymm.insert(std::pair<char,int>('c',60));
mymm.insert(std::pair<char,int>('d',60));
std::cout << "mymm contains:\n";
for (char ch='a'; ch<='d'; ch++)
{
std::pair <std::multimap<char,int>::iterator, std::multimap<char,int>::iterator> ret;
ret = mymm.equal_range(ch);
std::cout << ch << " =>";
for (std::multimap<char,int>::iterator it=ret.first; it!=ret.second; ++it)
std::cout << ' ' << it->second;
std::cout << '\n';
}
И результат называется:
mymm contains:
a => 10
b => 20 30 40
c => 50 60
d => 60
Но разве это не так? Для 'd', например, условие it!=ret.second
немедленно потерпит неудачу и цикл никогда не будет выполнен? Или я неправильно понял? (Это важно, так как я основал некоторый код на этом примере и, на второй взгляд, думаю, что он может плохо себя вести.)
2 ответа
Второй итератор в диапазоне - это "один за другим" того места, где он будет таким же, как mymm.end()
работает. Если mymm.begin()
а также mymm.end()
так же нет ничего в контейнере. Вот, ret.first
а также ret.second
то же самое означает, что в результирующем диапазоне нет элемента. Поскольку есть один элемент для "д", ret.first
указывает на этот элемент и ret.second
такой же как mymm.end()
,
Нет, это не так. В соответствии с
Возвращает диапазон, содержащий все элементы с данным ключом в контейнере. Диапазон определяется двумя итераторами: один указывает на первый элемент, который не меньше ключа, а другой указывает на первый элемент, который больше ключа.
с http://en.cppreference.com/w/cpp/container/multimap/equal_range это работает как положено.