Удаление на промежутке в multiset

163
08 июля 2019, 07:40

Как в multiset удалять элементы на промежутке [first, last] (рамки промежутка вводятся с консоли)? first и last - условные позиции элементов, если бы они имели индексы

Answer 1

Если я вас правильно понял, то вы имеете в виду что-то вроде этого

#include <iostream>
#include <set>
int main() 
{
    std::multiset<int> set = { 0, 2, 4, 6, 8 };
    for ( const auto &i : set ) std::cout << i << ' ';
    std::cout << std::endl;
    int lower = 3, upper = 7;
    set.erase( set.lower_bound( lower ), set.upper_bound( upper ) );
    for ( const auto &i : set ) std::cout << i << ' ';
    std::cout << std::endl;
}

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

0 2 4 6 8 
0 2 8

Если вы имеете в виду что-то вроде индексов, то код может выглядеть следующим образом

#include <iostream>
#include <set>
#include <iterator>
int main() 
{
    std::multiset<int> set = { 0, 2, 2, 4, 4, 4, 6, 6, 8 };
    for ( const auto &i : set ) std::cout << i << ' ';
    std::cout << std::endl;
    std::multiset<int>::size_type lower = 3, upper = 5;
    set.erase( std::next( std::begin( set ), lower ), 
               std::next( std::begin( set ), upper + 1 ) );
    for ( const auto &i : set ) std::cout << i << ' ';
    std::cout << std::endl;
}

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

0 2 2 4 4 4 6 6 8 
0 2 2 6 6 8 

То есть удаляются элементы с "индексами" 3, 4, 5. Индексация ведется от 0.

Вы можете также вставить проверку индексов, что они не выходят за допустимый диапазон. Например, проверку для верхнего индекса может выглядеть так, как показано в демонстрационной программе ниже

#include <iostream>
#include <set>
#include <iterator>
int main() 
{
    std::multiset<int> set = { 0, 2, 2, 4, 4, 4, 6, 6, 8 };
    for ( const auto &i : set ) std::cout << i << ' ';
    std::cout << std::endl;
    std::multiset<int>::size_type lower = 3, upper = 10;
    upper = upper < set.size() ? upper + 1 : set.size();
    set.erase( std::next( std::begin( set ), lower ), 
               std::next( std::begin( set ), upper ) );
    for ( const auto &i : set ) std::cout << i << ' ';
    std::cout << std::endl;
}

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

0 2 2 4 4 4 6 6 8 
0 2 2 
READ ALSO
Аллокаторы памяти

Аллокаторы памяти

Не так давно услышал о том, что существует способ управлять памятью самому, а не использовать, например, new и deleteМожет кто-нибудь сможет осветить...

140
Получение элемента из QTableWidget

Получение элемента из QTableWidget

QTableWidgetУсловие: Создать квадратную матрицуМатрица должна содержать слова из 4х букв английского алфавита

160
Присваивание массива

Присваивание массива

Вопрос в следующем: если присваивать в цикле:

134