0 / 0 / 0
Регистрация: 04.01.2017
Сообщений: 9
1

Избавиться от цикла, используя алгоритмы из STL

04.01.2017, 15:45. Показов 1768. Ответов 20
Метки нет (Все метки)

Сделал вот такую функцию... Она создает из вектора ассоциативный массив, у которого ключ - элемент вектора, а значение - частота повторений этого элемента. Вопрос - возможно ли переделать программу так, чтобы вместо цикла использовался алгоритм из STL? Последние три строчки можно не смотреть..они отвечают за нахождение самого частого элемента...

C++
1
2
3
4
5
6
7
8
9
10
11
12
int processingRow(list<int> row)
{
    map<int, int> newRow;
    list<int>::iterator i;
    for (i = row.begin(); i != row.end(); ++i)
    {
        newRow.insert(make_pair(*i, count(row.begin(), row.end(), *i)));
    };
    map<int, int>::iterator k;
    k = max_element(newRow.begin(), newRow.end(), check);
    return k->first;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2017, 15:45
Ответы с готовыми решениями:

Найти элемент в контейнере priority_queue, используя STL вские итераторы и алгоритмы
Здравствуйте, задача описана в навание темы. Можно перебрать в цикле все элементы очереди,...

Функторы и алгоритмы stl
Добрый день! Интересует такой вопрос. Я хочу, используя стандартный алгоритм стл for_each() и...

STL алгоритмы сортировки
Здрасти. В STL есть алгоритмы sort - упорядочивает последовательность и stable_sort -...

Задача на С++. Алгоритмы библиотеки STL.
Программа должна демонстрировать использование контейнерных классов для хранения встроенных типов...

20
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
04.01.2017, 15:50 2
Лучший ответ Сообщение было отмечено Almidu как решение

Решение

C++
1
2
3
    for_each(row.begin(),row.end(),[&newRow,&row](int &x) {
        newRow.insert(make_pair(x, count(row.begin(), row.end(), x)));
    });
1
0 / 0 / 0
Регистрация: 04.01.2017
Сообщений: 9
04.01.2017, 16:06  [ТС] 3
Peoples, благодарю.... А, если не трудно,, можете пояснить, как это работает?

Добавлено через 8 минут
и еще один вопрос... можно ли последний аргумент в for_each переделать отдельно как функцию..
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
04.01.2017, 16:18 4
Цитата Сообщение от Almidu Посмотреть сообщение
можно ли последний аргумент в for_each переделать отдельно как функцию
Да.
0
25 / 25 / 5
Регистрация: 04.01.2017
Сообщений: 52
04.01.2017, 16:20 5
Almidu, да, аргументом можно передавать указатель на на функцию или функциональные объекты(функторы).
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
04.01.2017, 16:24 6
Например
C++
1
2
3
4
        auto a=[&newRow,&row](int &x) {
        newRow.insert(make_pair(x, count(row.begin(), row.end(), x)));
    };
    for_each(row.begin(),row.end(),a);
0
25 / 25 / 5
Регистрация: 04.01.2017
Сообщений: 52
04.01.2017, 16:24 7
Будет лучше привести пример для лучшего понимания:

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
// for_each example
#include <iostream>     // std::cout
#include <algorithm>    // std::for_each
#include <vector>       // std::vector
 
void myfunction (int i) {  // function:
  std::cout << ' ' << i;
}
 
struct myclass {           // function object type:
  void operator() (int i) {std::cout << ' ' << i;}
} myobject;
 
int main () {
  std::vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);
 
  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);
  std::cout << '\n';
 
  // or:
  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);
  std::cout << '\n';
 
  return 0;
}
Взят со справочного ресурса http://www.cplusplus.com.
0
0 / 0 / 0
Регистрация: 04.01.2017
Сообщений: 9
04.01.2017, 17:02  [ТС] 8
FHelio, не можешь помочь как в моем случае сделать? или хотя бы подсказку дать?

Добавлено через 3 минуты
Цитата Сообщение от Peoples Посмотреть сообщение
Например
C++
1
2
3
4
        auto a=[&newRow,&row](int &x) {
        newRow.insert(make_pair(x, count(row.begin(), row.end(), x)));
    };
    for_each(row.begin(),row.end(),a);
а не используя переменные... просто чтобы отдельно функция была..
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
04.01.2017, 17:02 9
Almidu, Это и есть функция. auto a-это лямбда-функция
0
0 / 0 / 0
Регистрация: 04.01.2017
Сообщений: 9
04.01.2017, 17:05  [ТС] 10
Peoples, можешь пояснить, что означает выражение внутри квадратных скобок?
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
04.01.2017, 17:08 11
Захватывается ссылка на вектор(что бы использовать count) и мапу(что бы добавлять элементы)
0
0 / 0 / 0
Регистрация: 04.01.2017
Сообщений: 9
04.01.2017, 17:16  [ТС] 12
Цитата Сообщение от FHelio Посмотреть сообщение
Будет лучше привести пример для лучшего понимания:

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
// for_each example
#include <iostream>     // std::cout
#include <algorithm>    // std::for_each
#include <vector>       // std::vector
 
void myfunction (int i) {  // function:
  std::cout << ' ' << i;
}
 
struct myclass {           // function object type:
  void operator() (int i) {std::cout << ' ' << i;}
} myobject;
 
int main () {
  std::vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);
 
  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);
  std::cout << '\n';
 
  // or:
  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);
  std::cout << '\n';
 
  return 0;
}
Взят со справочного ресурса http://www.cplusplus.com.
Peoples, мне нужно примерно как здесь сделать функцию...
Возможно ли это?
Просто, боюсь не примут у меня это.. т.к. не изучали auto
0
Любитель чаепитий
3734 / 1793 / 562
Регистрация: 24.08.2014
Сообщений: 5,994
Записей в блоге: 1
04.01.2017, 17:30 13
Цитата Сообщение от Almidu Посмотреть сообщение
Возможно ли это?
Нормальными путями - нет.
Цитата Сообщение от Almidu Посмотреть сообщение
не изучали auto
Самое время.
http://en.cppreference.com/w/cpp/language/auto
0
0 / 0 / 0
Регистрация: 04.01.2017
Сообщений: 9
04.01.2017, 18:01  [ТС] 14
GbaLog-, жаль...
Цитата Сообщение от GbaLog- Посмотреть сообщение
Нормальными путями - нет.
А какие варианты?
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
04.01.2017, 18:15 15
Цитата Сообщение от Almidu Посмотреть сообщение
А какие варианты?
Цикл чем не устраивает?
0
0 / 0 / 0
Регистрация: 04.01.2017
Сообщений: 9
04.01.2017, 18:17  [ТС] 16
Добавлено через 22 секунды
Цитата Сообщение от nd2 Посмотреть сообщение
Цикл чем не устраивает?
nd2, по заданию нужно сделать без циклов
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
04.01.2017, 18:21 17
Понятно.
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,117
04.01.2017, 18:25 18
Так и сделайте без циклов. Если хотите чтобы вам помогли - предоставьте минимальный компилируемый пример, демонстрирующий вашу проблему.
0
0 / 0 / 0
Регистрация: 04.01.2017
Сообщений: 9
04.01.2017, 18:36  [ТС] 19
Цитата Сообщение от Peoples Посмотреть сообщение
C++
1
2
3
    for_each(row.begin(),row.end(),[&newRow,&row](int &x) {
        newRow.insert(make_pair(x, count(row.begin(), row.end(), x)));
    });
S_el, я и сделал, как мне здесь посоветовали, единственная проблема, что мне нужно переписать без использования лямбда-
функции
0
Любитель чаепитий
3734 / 1793 / 562
Регистрация: 24.08.2014
Сообщений: 5,994
Записей в блоге: 1
04.01.2017, 18:39 20
Лучший ответ Сообщение было отмечено Almidu как решение

Решение

Цитата Сообщение от Almidu Посмотреть сообщение
А какие варианты?
Не проверял, ибо контекста нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int processingRow(list<int> row)
{
    struct RowInserter
    {
        map<int, int>& newRow;
        list<int>& row;
        
        RowInserter(map<int, int>& newRow, list<int>& row) : newRow(newRow), row(row) {}
        
        void operator()(int n) { newRow[n] = count(row.begin(), row.end(), n); }
    };
    
    map<int, int> newRow;
    
    RowInserter inserter(newRow, row);
    
    list<int>::iterator i;
    for_each(row.begin(), row.end(), inserter);
    map<int, int>::iterator k;
    k = max_element(newRow.begin(), newRow.end(), check);
    return k->first;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2017, 18:39
Помогаю со студенческими работами здесь

Алгоритмы STL Удаление элементов в векторе
Банальный вопрос. vector&lt;int&gt; В нем разные числа могут повторяться. Хочу удалить заданное...

Стандартная библиотека шаблонов STL Алгоритмы
Здравствуйте помогите пожалуйста сделать сортировку по фамилии // ConsoleApplication59.cpp:...

Контейнер map и алгоритмы STL: несовместимость?
Всем доброго времени суток! Столкнулся с проблемой: алгоритм remove_if не работает с контейнером...

Алгоритмы замещения страниц(STL, вторая попытка)
Помогите пожалуйста найти ошибку в алгоритме, вроде все правильно работает, но иногда при разных...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru