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

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

Войти
Регистрация
Восстановить пароль
 
Norizo
Сообщений: n/a
#1

Найти количество элементов массива - C++

16.11.2012, 18:50. Просмотров 925. Ответов 16
Метки нет (Все метки)

Найти количество элементов массива (a1,a2,a3,...,an), удовлетворяющих условиям b<a<c.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 18:50     Найти количество элементов массива
Посмотрите здесь:

Найти количество элементов в этих массива равных первому элементу массива S C++
Найти количество нулей среди элементов массива, расположенных между минимальным и максимальным элементом массива. C++
Массив. Найти количество элементов, меньших среднего арифметического положительных элементов этого массива C++
Найти количество элементов превышающих среднее арифметическое всех элементов массива C++
C++ Найти через индекс количество отрицательных и количество положительных элементов массива
C++ Найти сумму положительных элементов массива и количество этих элементов
C++ Найти количество элементов массива, не превосходящих среднее значение элементов на главной диагонали
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bananasus
2 / 2 / 0
Регистрация: 01.11.2012
Сообщений: 37
16.11.2012, 18:52     Найти количество элементов массива #2
C
1
2
3
4
5
for(int i=0,N=0; i<n; i++)
{
     if(mas[i]<c && mas[i]>b)
     ++N;
}
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
16.11.2012, 18:56     Найти количество элементов массива #3
C++
1
int count = std::count_if(mas, mas + n, [b,c] (int v) { return v < c && v > b; });
bananasus
2 / 2 / 0
Регистрация: 01.11.2012
Сообщений: 37
16.11.2012, 20:41     Найти количество элементов массива #4
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
int count = std::count_if(mas, mas + n, [b,c] (int v) { return v < c && v > b; });
Выпендреж это конечно хорошо) Но судя по вопросу предыдущий пример и так будет сложен для понимания ТС.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
16.11.2012, 21:28     Найти количество элементов массива #5
bananasus, А чем это сложно?
gsm180
20 / 12 / 1
Регистрация: 19.10.2012
Сообщений: 102
Записей в блоге: 1
16.11.2012, 21:50     Найти количество элементов массива #6
C++
1
2
3
4
5
6
int sum(int *f,int a, int b){
    int res=0;
    while(*f){
        if(*f>a&&*f<b)res++;//количиство элементов удовлитворяющих условиям
        f++;}//перебираем элементы массива
    return res;}
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
16.11.2012, 22:13     Найти количество элементов массива #7
Цитата Сообщение от ForEveR Посмотреть сообщение
bananasus, А чем это сложно?
Тем, что в большинстве уроков С++, и в том числе в книге Страуструпа стандартная библиотека рассматривается в последнюю очередь, когда ученик знаком и с языком С и с основами ООП и вообще потратил на обучение достаточно времени и написал все эти вектора/списки/очереди самостоятельно в процессе выполнения заданий по предыдущим разделам.
Более того, во многих курсах по обучению С++, STL не рассматривается вообще.
Ну и уж тем более ни один учитель, не примет домашнее задание, сделаное по шаблону, т.к. все эти задачки на циклы призваны научить составлять простые алгоритмы. А не пользоваться шаблонами.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
17.11.2012, 00:27     Найти количество элементов массива #8
Kuzia domovenok, Мне-то до этого какое дело? Я пишу откровенно говоря, чтобы свои знания закрепить, показать элегантное решение, а обычное решение через циклы мне писать абсолютно незачем, довольно редко я таким пользуюсь. Человек, который хочет понять, как работает тот или иной алгоритм - прочитает про него и сделает по-своему.) К слову, в книге Страуструпа, по крайней мере в той, что для новичков STL начинает рассматриваться и использоваться сразу.
Croessmah
17.11.2012, 02:21
  #9

Не по теме:

Цитата Сообщение от bananasus Посмотреть сообщение
[b,c] (int v) { return v < c && v > b; }
думаю это, он точно не поймет
[b,c] (int v) { return v < c && v > b; }

bananasus
2 / 2 / 0
Регистрация: 01.11.2012
Сообщений: 37
18.11.2012, 13:01     Найти количество элементов массива #10
Да и вообще, твой вариант работает намного медленней!)
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.11.2012, 18:57     Найти количество элементов массива #11
bananasus, И что далее? Как проводились тесты? С какой оптимизацией? Какое здесь дело до скорости выполнения?
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
18.11.2012, 19:35     Найти количество элементов массива #12
Цитата Сообщение от ForEveR Посмотреть сообщение
bananasus, И что далее? Как проводились тесты? С какой оптимизацией? Какое здесь дело до скорости выполнения?
За универсальность всё же приходится платить. Эти шаблонные методы наверняка реализованы через те же циклы. Т.к. это необходимый минимум для решения данной задачи.
Но при этом в добавок к этому минимуму в цикле могут выполняться дофига проверок, например на безопасность, на выход за границы, вызовы каких-нибудь конструкторов временных объектов...
...А может и не выполняться, мы не знаем. Но то, что алгоритм тот же, а значит его скорость меньше или равна простому понятному циклу - факт.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.11.2012, 20:25     Найти количество элементов массива #13
Kuzia domovenok, Верно. Зато код выглядит элегантнее и проще для определенной категории людей. А так же из за проверок, он безопаснее.
MrGluck
Ворчун
Эксперт CЭксперт С++
6430 / 3628 / 450
Регистрация: 29.11.2010
Сообщений: 9,590
19.11.2012, 01:36     Найти количество элементов массива #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Тем, что в большинстве уроков С++, и в том числе в книге Страуструпа стандартная библиотека рассматривается в последнюю очередь, когда ученик знаком и с языком С и с основами ООП и вообще потратил на обучение достаточно времени и написал все эти вектора/списки/очереди самостоятельно в процессе выполнения заданий по предыдущим разделам.
Более того, во многих курсах по обучению С++, STL не рассматривается вообще.
Ну и уж тем более ни один учитель, не примет домашнее задание, сделаное по шаблону, т.к. все эти задачки на циклы призваны научить составлять простые алгоритмы. А не пользоваться шаблонами.
Именно поэтому, сразу после примера с cout<< "Hello world" идет использование контейнера string, а в следующей главе рассматривают векторы. (Принципы и практика использования).
Кстати, в первой главе (стр. 50) книги "Язык программирования С++" написано: "В целом, не пытайтесь программировать то, что уже запрограммировано в стандартной библиотеке." Пусть будет альтернатива того, как надо делать. А на С-подобном С++ напишут и другие.

Добавлено через 19 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
...А может и не выполняться, мы не знаем.
знаем
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class InputIt, class UnaryPredicate>
typename iterator_traits<InputIt>::difference_type
    count_if(InputIt first, InputIt last, UnaryPredicate p)
{
    typename iterator_traits<InputIt>::difference_type ret = 0;
    for (; first != last; ++first) {
        if (p(*first)) {
            ret++;
        }
    }
    return ret;
}
В данном случае да, скорость будет одинакова и реализация схожа, но это отнюдь не значит, что все велосипеды будут кататься быстрее реализаций в STL.
bananasus
2 / 2 / 0
Регистрация: 01.11.2012
Сообщений: 37
19.11.2012, 16:01     Найти количество элементов массива #15
Да где же одинакова?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
19.11.2012, 19:21     Найти количество элементов массива #16
bananasus, Я кажется спрашивал про то, какие тесты проводились, какой уровень оптимизации, в какой версии сборки. Ответа я не получил. Ну тогда выкладываю свои результаты. Код.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <chrono>
#include <vector>
#include <algorithm>
#include <ctime>
#include <random>
 
const size_t iterates = 10000;
const size_t vector_size = 1000;
 
std::vector<int> generate(std::mt19937& generator, std::uniform_int_distribution<>& distr)
{
    std::vector<int> v(vector_size);
    std::generate(v.begin(), v.end(), [&generator, &distr]() { return distr(generator); });
    return v;
}
 
namespace chrono = std::chrono;
 
void output_time(const chrono::system_clock::time_point& begin,
                 const chrono::system_clock::time_point& end)
{
    auto result = end - begin;
    typedef decltype(result) result_type;
    std::cout << chrono::duration_cast<chrono::microseconds, result_type::rep, result_type::period>
        (result).count() << std::endl;
}
 
template<typename Gen, typename Rnd>
void first_case(Gen& gen, Rnd& rnd, int first, int second)
{
    auto begin = chrono::monotonic_clock::now();
    for (size_t i = 0; i < iterates; ++i)
    {
       std::vector<int> v = generate(gen, rnd);
       volatile int cnt = 0;
       for (size_t i = 0; i < v.size(); ++i)
       {
          if (v[i] < second && v[i] > first)
              ++cnt;
       }
    }
    auto end = chrono::monotonic_clock::now();
    output_time(begin, end);
}
 
template<typename Gen, typename Rnd>
void second_case(Gen& gen, Rnd& rnd, int first, int second)
{
    auto begin = chrono::monotonic_clock::now();
    for (size_t i = 0; i < iterates; ++i)
    {
        std::vector<int> v = generate(gen, rnd);
        volatile int cnt = std::count_if(v.begin(), v.end(), [first, second](int v)
        {
            return v < second && v > first;
        });
    }
    auto end = chrono::monotonic_clock::now();
    output_time(begin, end);
}
 
int main()
{
    const int b = 100, c = 50000;
    std::mt19937 gen(static_cast<unsigned int>(time(0)));
    std::uniform_int_distribution<> distr(0, 100000);
    auto v = generate(gen, distr);
    first_case(gen, distr, b, c);
    second_case(gen, distr, b, c);
}
Уровень оптимизации O2. Сборка - релиз.

1295074
1285073

Как-то плюс-минус так, вообщем примерно ровно.

Debug сборка под теми же O2

12580719
11064632
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 19:44     Найти количество элементов массива
Еще ссылки по теме:

Найти среднее арифметическое элементов массива, и количество чисел внутри массива, не превышающих найденное C++
C++ Найти количество элементов массива, каждый из которых меньше по значению, чем среднее среди элементов
C++ Найти количество элементов массива, каждый из которых меньше по значению чем среднее среди элементов
Найти количество нулевых и количество отрицательных элементов массива C++
Найти произведение элементов массива с чётными номерами и количество элементов, удовлетворяющих условию C++

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт CЭксперт С++
6430 / 3628 / 450
Регистрация: 29.11.2010
Сообщений: 9,590
19.11.2012, 19:44     Найти количество элементов массива #17
Что и следовало ожидать, алгоритм тот же:
В цикле по контейнеру(массиву) от начала до конца проверяем каждый элемент на выполнение условия/предиката. Если истина - увеличиваем счетчик на 1. Разница в операторах < и != явно не ощутима, предикат по сути использует ту же логику. Так с чего бы алгоритмам отличаться по времени? С того, что в первом случае обход в цикле происходит путем инкрементирования индекса, а во втором итератора(грубо говоря, указателя)? Аргументируйте вашу позицию, bananasus.
Yandex
Объявления
19.11.2012, 19:44     Найти количество элементов массива
Ответ Создать тему
Опции темы

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