Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
marina_vagina
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
#1

Удалить из массива все максимальные элементы (с помощью векторов, алгоритмов) - C++

03.06.2013, 01:09. Просмотров 502. Ответов 8
Метки нет (Все метки)

Решить надо с помощью векторов, алгоритмов. Я так не умею и вот, что у меня получилось:


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
#include <iostream>
#include <algorithm>
using namespace std;
 
bool f(int a[10])
{int max=0;
     for(int i=0; i<n; i++)
     if (a[i]>max)
     max=a[i];
return true;
    return false;
}
int main()
{
    int a[10];
    int n;
    cout<<"n=";
    cin>>n;
    for(int i=0;i<n;i++)
    {
            cout<<"a["<<i<<"]=";
            cin>>a[i];
    }
    remove_if(a,a+n-1,f);
    for (int i=0;i<n;i++)
    cout<<"a["<<i<<"]="<<a[i]<<endl;
     system ("pause");
     return 0;
}
Вопрос в функции, ошибка какая-то. Помогите, пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2013, 01:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить из массива все максимальные элементы (с помощью векторов, алгоритмов) (C++):

Удалить из массива все максимальные элементы - C++
Всем здравствуйте!!! Помогите плиз заочнику неуспевающему с контрольными из-за работы. Учусь на первом курсе. Я конечно понимаю, что позорю...

Из целочисленного массива Х все четные элементы записать в массив Y. Удалить в массивах максимальные элементы - C++
Из целочисленного массива Х(N) все четные элементы записать в массив Y(k). Удалить в массивах максимальные элементы. В программе написать...

Удалить из целочисленного массива все максимальные элементы - C++
Удалить из целочисленного массива все максимальные элементы и вставить после последнего удаленного минимальный элемент. Буду очень...

Алгоритмы STL. Дана последовательность целых чисел. Удалить из массива все максимальные элементы - C++
Дана последовательность целых чисел.Удалить из массива все максимальные элементы. Использовать Алгоритмы STL. Помогите доработать) ...

Массив: Сформировать третий массив, в который включить все отрицательные элементы массива А и все максимальные элементы массива В. - C++
Даны массивы целых чисел A и B. Сформировать третий массив, в который включить все отрицательные элементы массива А и все максимальные...

Создать двусвязный список, содержащий целые числа. Удалить все максимальные элементы - C++
Создать двусвязный список, содержащий целые числа. Удалить все максималь* ные элементы. Например, для списка 5 2 9 1 3 7 9 2 9, результат...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.06.2013, 01:38 #2
Начнем с того что в обычном сишнем массиве элементы удалить нельзя.

Добавлено через 4 минуты
Цитата Сообщение от marina_vagina Посмотреть сообщение
надо с помощью векторов, алгоритмов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
    std::vector<int> v{1,2,3,4,5,6,7,8,9,10};
    v.erase(std::remove_if(v.begin(), v.end(), [](const int i){return i > 5;}), v.end());
    for (const int i : v) std::cout<<i<<" ";
    
    std::cout<<std::endl;
    return 0;
}
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 842
Регистрация: 27.09.2012
Сообщений: 18,402
Записей в блоге: 3
Завершенные тесты: 1
03.06.2013, 03:47 #3
Цитата Сообщение от marina_vagina Посмотреть сообщение
Решить надо с помощью векторов, алгоритмов.
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
 
int main(){
    std::vector<int> vec{4,2,8,2,1,8,4,3,2,4,5,8,6,4};
    std::copy(vec.begin(),vec.end(),std::ostream_iterator<int>(std::cout," "));
    std::cout<<std::endl;
    vec.erase(
        std::remove_if(
            vec.begin(), vec.end(), 
            std::bind2nd(
                std::equal_to<int>(),*std::max_element(vec.begin(),vec.end())
            )
        ), 
        vec.end()
    );
    std::copy(vec.begin(),vec.end(),std::ostream_iterator<int>(std::cout," "));
    std::cout<<std::endl;
    
    std::cout<<std::endl;
    return 0;
}
2
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
03.06.2013, 08:35 #4
Можно было бы сначала посчитать максимум, а лишь потом удалять, дабы в цикле не вызывать постоянно.

Не по теме:

yuron_477, немного не то. Максимумы это числа == максимуму, а не превосходящие некое значение одного из элементов

0
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
03.06.2013, 09:05 #5
Croessmah, только немного непонятно, зачем было использовать remove_if, когда здесь сойдет и обыкновенный std::remove()
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 842
Регистрация: 27.09.2012
Сообщений: 18,402
Записей в блоге: 3
Завершенные тесты: 1
03.06.2013, 12:07 #6
MrGluck, В адаптер помещается значение возвращенное min_element, а не вызов данной функции. Обратите внимание на оператор разыменования предиката.

Добавлено через 5 минут
А remove_if из-за копипаста поста 2 остался, Собственно поэтому и был использован адаптер.
Если с remove, то можно и без него.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
03.06.2013, 12:46 #7
Croessmah, max_element.
Меня почему-то переклинило, думал что каждый цикл вычисляет, потом разыменовывает, но судя по тесту
Кликните здесь для просмотра всего текста
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
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
#include <chrono>
 
using std::chrono::duration_cast;
using std::chrono::microseconds;
using std::chrono::steady_clock;
 
int main(){
    std::vector<int> vec(10000000);
    steady_clock::time_point start = steady_clock::now();
    auto max = *std::max_element(vec.begin(),vec.end());
    vec.erase(
        std::remove_if(
            vec.begin(), vec.end(),
            std::bind2nd(
                std::equal_to<int>(), max)
            )
        ,
        vec.end()
    );
    steady_clock::time_point end = steady_clock::now();
 
    std::cout << "First: "
              << duration_cast<microseconds>(end - start).count() << std::endl;
 
    // *************************************************************************
    std::vector<int> vec2(10000000);
    start = steady_clock::now();
    vec2.erase(
        std::remove_if(
            vec2.begin(), vec2.end(),
            std::bind2nd(
                std::equal_to<int>(),*std::max_element(vec2.begin(),vec2.end())
            )
        ),
        vec2.end()
    );
    end = steady_clock::now();
 
    std::cout << "Second: "
              << duration_cast<microseconds>(end - start).count() << std::endl;
}

все таки идентичны, то ли компиль оптимизирует.
Я то думал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class ForwardIterator, class UnaryPredicate>
  ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                             UnaryPredicate pred)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!pred(*first)) {
      *result = *first;
      ++result;
    }
    ++first;
  }
  return result;
}
pred вызывается каждый раз и адаптер аналогично каждый раз просчитывает max_element.
Все равно я бы отделил просчет макс. элемента т.к. не за чем одну большую инструкцию загромождать. По мне, так читаемость кода возрастает.
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 842
Регистрация: 27.09.2012
Сообщений: 18,402
Записей в блоге: 3
Завершенные тесты: 1
03.06.2013, 13:12 #8
может и вызывается, хотя по сути имеем второй параметра шаблона тип int, а переданное в оператор вызова функции значение уже вычисляется во время выполнения.
0
marina_vagina
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
03.06.2013, 13:41  [ТС] #9
Спасибо всем!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2013, 13:41
Привет! Вот еще темы с ответами:

Для одномерного массива удалить максимальные элементы и упорядочить по убыванию - C++
Задан массив Z(n) целых чисел. Найти максимальный элемент массива, и если это простое число – удалить все элементы, равные максимальному...

В заданной матрице удалить все столбцы, содержащие максимальные элементы среди диагональных элементов - C++
Сгенерировать матрицу размера NxN из случайных числел (N вводится с клавиатуры). Удалить все столбцы, содержащие максимальных элемент среди...

Удалить из массива целых чисел все нули. Сформировать два новых массива. В первый переписать все элементы данного массива с четными номерами, во второ - C++
Удалить из массива целых чисел все нули. Сформировать два новых массива. В первый переписать все элементы данного массива с четными...

Удалить из массива, в котором все элементы различны, максимальный и минимальный элементы - C++
Удалить из массива, в котором все элементы различны: а) максимальный элемент б) минимальный элемент Добавлено через 4 минуты ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.06.2013, 13:41
Ответ Создать тему
Опции темы

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