Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Как удалять один элемент из multiset, если в контейнере имеются дубликаты?

#cpp #stl #множества #multiset


При использовании метода erase() из мультимножества удаляются все элементы со значением
параметра. Можно, конечно, класть в контейнер пару, где first - номер элемента, second
- нужное значение, тогда дубликатов не будет. 

Но есть ли другое решение проблемы? 

Код:

#include 
#include 

using namespace std;

int main()
{
    multiset a = {1, 1, 3};

    for(int i: a)
        cout << i << " "; // Вывод: 1 1 3

    a.erase(1);

    cout << "\n";
    for(int i: a)
        cout << i << " "; // Вывод: 3

    return 0;
}

    


Ответы

Ответ 1



Работайте с итератором. Находите нужный вам элемент, вернее, ненужный :), вернее, итератор, указывающий на него - и вызывайте erase. С точки зрения multiset все значения с одним и тем же ключом совершенно неотличимы, как какие-нибудь электроны... С вашей - они вполне могут и отличаться, и тогда ваше дело - показать мультимножеству на него итератором и сказать "ату его"...

Ответ 2



Если вам нужно удалить один элемент, делайте erase(find(key)) вместо erase(key). Разумеется, в варианте erase(find(key)) надо добавить проверку на успешность поиска. Однако такой способ удалит "какой-то" из эквивалентных элементов. А уж как вы предлагаете выбирать конкретный элемент для удаления и нужно ли вам его выбирать - об этом вы пока не удосужились сообщить.

Комментариев нет:

Отправить комментарий