Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Eugene Dark
0 / 0 / 0
Регистрация: 29.10.2018
Сообщений: 19
1

Multiset

Сегодня, 00:25. Просмотров 102. Ответов 4
Метки c++ (Все метки)

Здравствуйте! Есть задача, по сути, она должна удалить те элементы, которые удовлетворяют моему условию. Я пробую найти индекс каждый третий элемент с помощью i % 3, затем их удалить с помощью erase. Ничего не выходит, тк вроде так нельзя и вроде удаляются числа, кратные 3, но почему то в моем тесте только цифра 3. Конечно, можно пойти по банальным массивам или векторам, но что-то не хочется. Подскажите, как исправить мой код, но чтоб идея multiset осталась. Пример для выполнения:
5
3 15 25 8 8
Итог:
3 8 15 25

У меня: 8 8 15 25.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <set>
#include <iterator>
 
using namespace std;
 
int main() {
    int n;
    multiset <int> s;
    multiset <int>::iterator it;
    cin >> n;
 
    for (auto &i : s) {
        int x;
        cin >> x;
        s.insert(x); 
    }
    
    if (n % 2) {
       for (int i = 0; i < n; ++i) {
           if (!(i % 3)) {
               s.erase(i);               
           }
       }
    }
    
    copy(s.begin(), s.end(), ostream_iterator<int>(cout, " "));
 
  return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
Сегодня, 00:25
Ответы с готовыми решениями:

Multiset
Какой параметр надо задать контейнеру, чтобы он сортировал по убыванию? Или нужен какой-то алгоритм?

Std::multiset::find
Каким образом функция сравнивает элементы, если я не перегрузил == У меня в классе два поля, она...

Подскажите ошибку с multiset
Задача: Суперминимум Дано n чисел. Для каждых k подряд идущих чисел найти минимальное среди...

Вывод на консоль данных Multiset
Вобщем, задали следующее задание. Создать пустое мультиотображение (ключ - фамилия абонента,...

Multiset: исправить ошибку в коде
Доброго времени суток. Хотела забить в multiset элементы и вывести их в порядке убывания. Вот...

4
JaponDemon
156 / 101 / 55
Регистрация: 30.08.2018
Сообщений: 345
Завершенные тесты: 1
Сегодня, 00:33 2
мультисет это -- binary search tree .
Откуда в binary search tree индексы ?
Пересмотрите идею, поменяйте мультимэп на вектор или дек
0
TRam_
зомбяк
787 / 724 / 230
Регистрация: 14.05.2017
Сообщений: 2,475
Сегодня, 00:40 3
Цитата Сообщение от Eugene Dark Посмотреть сообщение
она должна удалить те элементы, которые удовлетворяют моему условию
Лучше сделай с векторами, чтобы копировала в другой вектор элементы, не удовлетворяющие условию. Тем более для данного случая их число легко посчитать.

Добавлено через 4 минуты
Цитата Сообщение от Eugene Dark Посмотреть сообщение
Итог:
3 8 15 25
То есть после ввода их надо ещё отсортировать по возрастанию? Тогда пройдись сортировкой.
0
Eugene Dark
0 / 0 / 0
Регистрация: 29.10.2018
Сообщений: 19
Сегодня, 14:27  [ТС] 4
TRam_, значит нельзя моими методами делать? Эх, ладно
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7087 / 3391 / 459
Регистрация: 04.12.2011
Сообщений: 9,437
Записей в блоге: 5
Сегодня, 15:31 5
Цитата Сообщение от Eugene Dark Посмотреть сообщение
TRam_, значит нельзя моими методами делать?
Именно. Eugene Dark, вы пишете:
Цитата Сообщение от Eugene Dark Посмотреть сообщение
Есть задача, по сути, она должна удалить те элементы, которые удовлетворяют моему условию.
Это вкратце: Есть задача с условием.
Далее:
Цитата Сообщение от Eugene Dark Посмотреть сообщение
Я пробую найти индекс каждый третий элемент с помощью i % 3, затем их удалить с помощью erase.
Это непонятно. Удалять по номеру в последовательности, это слепая жесть. Хотя выполнимо. Вот что можно сделать, например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <set>
using namespace std;
 
int main(int argc, char **argv)
{
    multiset<int> msi{1,3,789,67,78,23,4,8,5,22,5,3,3,4,5,7,1,1,1};
    cout<<"sourece:\n";
    for(const auto& elem : msi)
    {
        cout<<elem<<' ';
    }
   int number(0);
   multiset<int>::const_iterator start_it = msi.begin(), final_it = msi.end();
   while(start_it != final_it)
   {
       if(0 == *start_it++%3) msi.erase(start_it++);
   }
   cout<<"\nresult:\n";
   for(const auto& elem : msi)
   {
       cout<<elem<<' ';
   }
 
cin.get();
return 0;
}
Добавлено через 15 минут
и "по номерам":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <set>
using namespace std;
 
int main(int argc, char **argv)
{
    multiset<int> msi{1,3,789,67,78,23,4,8,5,22,5,3,3,4,5,7,1,1,1};
    cout<<"sourece:\n";
    for(const auto& elem : msi)
    {
        cout<<elem<<' ';
    }
   int number(0);
   multiset<int>::const_iterator start_it = msi.begin(), final_it = msi.end(),
           tobe_erased;
   while(start_it != final_it)
   {
       //cout << number << endl;
 
       if(0 == number++%3)
       {
           tobe_erased=start_it++;
           msi.erase(tobe_erased);
       }else
       ++start_it;
   }
   cout<<"\nresult:\n";
   for(const auto& elem : msi)
   {
       cout<<elem<<' ';
   }
 
cin.get();
return 0;
}
0
Сегодня, 15:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
Сегодня, 15:31

Реализовать контейнер multiset к классу
Здравствуйте у меня есть класс и мне надо реализовать контейнер multiset к этому классу. Проблема в...

С++ Builder STL copy/sort multiset
есть две проблемы: 1) ф-ция copy не компилируеться multiset&lt;double&gt; MS,MS2;...

как доступиться то елемента multiset за номером в массиве ?
Никак не могу найти покажите програмно


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru