Следует не забывать о различие в эффектах вызова метода
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.