On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 25.07.18 16:08. Заголовок: Различие в вызове метода erase с указанием ключа или итератора для ассоциативных мульти-контейнеров.


Следует не забывать о различие в эффектах вызова метода erase для ассоциативных мульти-контейнеров, когда в одном случае в качестве аргумента используется ключ, а в другом случае - итератор.

В первом случае удаляются все элементы контейнера с заданным ключом.

Во втором случае удаляется только тот элемент контейнера, на который указывает итератор.

Ниже представлена демонстрационная программа на примере использования ассоциативных контейнеров std::unordered_multiset и std::unordered_multimap.

 
#include <iostream>
#include <unordered_set>
#include <unordered_map>

int main()
{
std::unordered_multiset<int> s { 1, 1, 1 };

std::cout << "Unordered multiset: ";
if ( not s.empty() )
{
for ( const auto &i : s ) std::cout << i << ' ';
std::cout << '\n';
}
else
{
std::cout << "the container is empty.\n";
}

s.erase( s.begin() );

std::cout << "After calling erase( iterator ): ";
if ( not s.empty() )
{
for ( const auto &i : s ) std::cout << i << ' ';
std::cout << '\n';
}
else
{
std::cout << "the containser is empty.\n";
}

s.erase( 1 );

std::cout << "After calling erase( key ): ";
if ( not s.empty() )
{
for ( const auto &i : s ) std::cout << i << ' ';
std::cout << '\n';
}
else
{
std::cout << "the container is empty.\n";
}

std::unordered_multimap<int, int> m = { { 1, 1 }, { 1, 2 }, { 1, 3 } };

std::cout << "\nUnordered_multimap: ";
if ( not m.empty() )
{
for ( const auto &i : m ) std::cout << '{' << i.first << ',' << i.second << "} ";
std::cout << '\n';
}
else
{
std::cout << "the container is empty.\n";
}

m.erase( m.begin() );

std::cout << "After calling erase( iterator ): ";
if ( not m.empty() )
{
for ( const auto &i : m ) std::cout << '{' << i.first << ',' << i.second << "} ";
std::cout << '\n';
}
else
{
std::cout << "the containser is empty.\n";
}

m.erase( 1 );

std::cout << "After calling erase( key ): ";
if ( not m.empty() )
{
for ( const auto &i : m ) std::cout << '{' << i.first << ',' << i.second << "} ";
std::cout << '\n';
}
else
{
std::cout << "the container is empty.\n";
}
}


Вывод программы на консоль:

 
Unordered multiset: 1 1 1
After calling erase( iterator ): 1 1
After calling erase( key ): the container is empty.

Unordered_multimap: {1,3} {1,2} {1,1}
After calling erase( iterator ): {1,2} {1,1}
After calling erase( key ): the container is empty.


Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 3
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет