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

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

Восстановить пароль Регистрация
 
Norizo
Сообщений: n/a
16.11.2012, 18:50     Найти количество элементов массива #1
Найти количество элементов массива (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++ Найти через индекс количество отрицательных и количество положительных элементов массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2012, 21:28     Найти количество элементов массива #5
bananasus, А чем это сложно?
gsm180
19 / 11 / 1
Регистрация: 19.10.2012
Сообщений: 100
Записей в блоге: 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
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.11.2012, 22:13     Найти количество элементов массива #7
Цитата Сообщение от ForEveR Посмотреть сообщение
bananasus, А чем это сложно?
Тем, что в большинстве уроков С++, и в том числе в книге Страуструпа стандартная библиотека рассматривается в последнюю очередь, когда ученик знаком и с языком С и с основами ООП и вообще потратил на обучение достаточно времени и написал все эти вектора/списки/очереди самостоятельно в процессе выполнения заданий по предыдущим разделам.
Более того, во многих курсах по обучению С++, STL не рассматривается вообще.
Ну и уж тем более ни один учитель, не примет домашнее задание, сделаное по шаблону, т.к. все эти задачки на циклы призваны научить составлять простые алгоритмы. А не пользоваться шаблонами.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2012, 18:57     Найти количество элементов массива #11
bananasus, И что далее? Как проводились тесты? С какой оптимизацией? Какое здесь дело до скорости выполнения?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
18.11.2012, 19:35     Найти количество элементов массива #12
Цитата Сообщение от ForEveR Посмотреть сообщение
bananasus, И что далее? Как проводились тесты? С какой оптимизацией? Какое здесь дело до скорости выполнения?
За универсальность всё же приходится платить. Эти шаблонные методы наверняка реализованы через те же циклы. Т.к. это необходимый минимум для решения данной задачи.
Но при этом в добавок к этому минимуму в цикле могут выполняться дофига проверок, например на безопасность, на выход за границы, вызовы каких-нибудь конструкторов временных объектов...
...А может и не выполняться, мы не знаем. Но то, что алгоритм тот же, а значит его скорость меньше или равна простому понятному циклу - факт.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2012, 20:25     Найти количество элементов массива #13
Kuzia domovenok, Верно. Зато код выглядит элегантнее и проще для определенной категории людей. А так же из за проверок, он безопаснее.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++

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

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

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