Форум » C/C++ для начинающих (C/C++ for beginners) » Различие в вызове метода erase с указанием ключа или итератора для ассоциативных мульти-контейнеров. » Ответить

Различие в вызове метода erase с указанием ключа или итератора для ассоциативных мульти-контейнеров.

Сыроежка: Следует не забывать о различие в эффектах вызова метода erase для ассоциативных мульти-контейнеров, когда в одном случае в качестве аргумента используется ключ, а в другом случае - итератор. В первом случае удаляются все элементы контейнера с заданным ключом. Во втором случае удаляется только тот элемент контейнера, на который указывает итератор. Ниже представлена демонстрационная программа на примере использования ассоциативных контейнеров std::unordered_multiset и std::unordered_multimap. [pre2] #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"; } } [/pre2] Вывод программы на консоль: [pre2] 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.[/pre2]

Ответов - 0



полная версия страницы