С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 94

Переписать с использованием STL Array

11.03.2018, 02:02. Показов 1684. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Написал вот такую программу,теперь хочу тоже самое только с использованием последовательного контейнера array. Направьте меня.
3аранее спасибо!


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
#include <iostream>
#include <cstdlib>
#include <array>
#include <iomanip>
#include <cstring>
#include <locale.h>
 
using namespace std;
template <class T, size_t N>
class array;
 
int main()
{
    setlocale(LC_ALL , "Rus");
    int D;
    int N;
    cout<<"Введите диапозон случайных чисел:  ";
    cin>>D;
    cout<<"Введите число:  ";
    cin>>N;
    if (N<=0)
    {
      cout<<"Были указаны неправильные значения"<<endl;
      system("pause");
      return 0;
    }
 
   int   *array = (int*)malloc(N*sizeof(int));
   int *checker = (int*)calloc(N,sizeof(int));
 
     int i;
    //Заполнение массива случайными числами
   for(i=0;i<N;i++)
    {
      array[i]=1 + rand()%D;
        cout.width(10);
        cout<<array[i];
        
    }
    cout<<"\n"<<endl;
  
    for(i=0; i<N; i++)
   {
      if (array[i]<N+1)
         checker[array[i]-1]++;
   }
   int REZ = 0;
   for(i=0; i<N; i++)
   {
      if (checker[i] == 0)
      {
         REZ = i+1;
         break;
      }
   }
   if (REZ == 0)
      cout<<"Найдены все числа\n"<<endl;
   else
       cout<<"Ненайденное число =  "<<REZ<<endl;
       system("pause");
     
   free(array);
   free(checker);
   return 0 ;
}
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2018, 02:02
Ответы с готовыми решениями:

Подскажите как переписать класс с использованием умных указателей, либо STL
К сожалению, знания об умных указателях и библиотеке STL прошли мимо меня... Сейчас пытаюсь восполнить этот пробел, но уже третий день не...

Дека с использованием STL
Люди! есть у кого нибудь есть программа реализующая дек на основе STL???

программы с использованием STL
Написать три программы с использованием STL. Первая и вторая программы должны демонстрировать работу с контейнерами STL, третья -...

24
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.03.2018, 02:59
Цитата Сообщение от lkruk Посмотреть сообщение
Направьте меня.
Сразу к выходу. Количество элементов в std::array должно быть известно на стадии компиляции.
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
11.03.2018, 03:00
Цитата Сообщение от lkruk Посмотреть сообщение
template <class T, size_t N>
class array;
Да еще вот это непонятно зачем.
0
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 94
11.03.2018, 11:45  [ТС]
Шаблон array я написал просто для начала,кроме шуток ничего полезного сказать не можете ...
0
 Аватар для Recrut_rf
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
11.03.2018, 11:57
Цитата Сообщение от lkruk Посмотреть сообщение
кроме шуток ничего полезного сказать не можете
Могу
Цитата Сообщение от lkruk Посмотреть сообщение
Направьте меня.
Есть такая книга на просторах интернета:
"Стандартная библиотека С++ Справочное руководство Второе издание Николаи М. Джосаттис" Сам часто пользуюсь. В ней всё про array.
0
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 94
11.03.2018, 12:43  [ТС]
Спасибо
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.03.2018, 15:05
std::vector используй.
0
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 94
11.03.2018, 16:53  [ТС]
Спасибо,но мне нужно через array.Я только начал изучать c++ я просто не могу понять ,как эти циклы впихнуть в контейнер array.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.03.2018, 16:56
Цитата Сообщение от lkruk Посмотреть сообщение
но мне нужно через array.
А как же это?
Цитата Сообщение от Croessmah Посмотреть сообщение
Количество элементов в std::array должно быть известно на стадии компиляции.
0
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 94
11.03.2018, 17:01  [ТС]
Вот у меня задачка вот такая "Дан цeлочислeнный массив рaзмера N. Eсли oн является перестановкой, то есть содeржит все числa от 1 дo N, то вывeсти 0; в противном случае вывeсти номeр пeрвого недoпустимого элeмента."
Я понимаю,что кол-во элементов должно быть известно заранее.Но если я захочу 1000 элементов в программе вывести ,через обычные массивы работает,а вот через контейнер я не пойму как.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.03.2018, 17:02
Цитата Сообщение от lkruk Посмотреть сообщение
через обычные массивы работает
Код покажете? В коде из стартового поста нет "обычных массивов".

P.S. А что такое необычные массивы?
0
 Аватар для Recrut_rf
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
11.03.2018, 17:09
Цитата Сообщение от lkruk Посмотреть сообщение
Спасибо,но мне нужно через array.Я только начал изучать c++ я просто не могу понять ,как эти циклы впихнуть в контейнер array.
array это по-сути тот же обычный статический массив, в нём просто реализована (если я не ошибаюсь) проверка на выход за пределы этого массива.

Цитата Сообщение от lkruk Посмотреть сообщение
как эти циклы впихнуть в контейнер array
работа с контейнерами такая же как и с обычными массивами, синтаксис может немного отличаться, но многие из них поддерживают операцию [], то есть можно как и в обычных массивах обращаться к элементу через [].
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.03.2018, 17:12
Цитата Сообщение от Recrut_rf Посмотреть сообщение
в нём просто реализована (если я не ошибаюсь) проверка на выход за пределы этого массива.
Нет, не реализована. Но у нас появляется удобный size, итераторы, отсутствует разложение (преобразование) до указателя, ...
0
 Аватар для Recrut_rf
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
11.03.2018, 17:31
Цитата Сообщение от Croessmah Посмотреть сообщение
Нет, не реализована.
А про что тогда вот эта фраза из справочного руководства по STL: "Он является более безопасным и не менее быстродействующим, чем обычные массивы" ?

Добавлено через 11 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Нет, не реализована
Всё, вспомнил - функция at(idx) возвращает элемент с индексом idx и проверяет выход за пределы массива (такая же функция есть и у других контейнеров (но не у всех) и с такой же проверкой). Кстати (если мне не изменяет память, а изучал я руководство где то 1.5 года назад) проверка выхода за пределы контейнера - чуть ли не единственное исключение, реализованное в STL, потому как обработка исключений - слишком затратная вещь и неприемлема для STL. Но вроде как существует и "безопасная" STL с обработкой "большого количества исключений".

Вся информация взята из книги, про которую я упоминал выше...
0
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 94
11.03.2018, 17:44  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Количество элементов в std::array должно быть известно на стадии компиляции.
как можно обойти это или никак?
0
 Аватар для Recrut_rf
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
11.03.2018, 18:11
Цитата Сообщение от lkruk Посмотреть сообщение
Но если я захочу 1000 элементов в программе вывести ,через обычные массивы работает,а вот через контейнер я не пойму как.
Да также через обычный цикл, можно через диапазонный цикл for, Для извра... , для тех, кто хочет выпендриваться (показывать свое мастерство) существует алгоритм for_each() (всё из той же STL)

Кликните здесь для просмотра всего текста

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 <array>
#include <algorithm>
#include <iostream>
 
using namespace std;
 
// функция, выводящая на экран передаваемый аргумент
void print(int elem)
{
    cout << elem << ' ';
}
 
int main()
{
    array<int, 10> coll;
 
// вставляем элементы от 1 до 9
    for (int i = 1; i < 10; ++i)
    {
        coll.at(i);
    }
 
// выводим на экран все элементы
    for_each(coll.cbegin(), coll.cend(), // диапазон
    print); // операция
    cout << endl;
}


Добавлено через 2 минуты
Цитата Сообщение от lkruk Посмотреть сообщение
как можно обойти это или никак?
никак array - это не динамический массив, Он содержит обычный статический массив в стиле языка С и предоставляет интерфейс контейнера STL .

Добавлено через 20 минут
Извиняюсь Код который, я опубликовал выше исправный, но в нём есть необязательная часть
C++
1
2
3
4
5
// вставляем элементы от 1 до 9
    for (int i = 1; i < 10; ++i)
    {
        coll.at(i);
    }
этот цикл не нужен - просто пример изначально был с вектором, а я решил переписать его под array, а в массивах элементы всегда инициализируются. Вот более правильный вариант:

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <array>
#include <algorithm>
#include <iostream>
 
using namespace std;
 
// функция, выводящая на экран передаваемый аргумент
void print(int elem)
{
    cout << elem << ' ';
}
 
int main()
{
    //array<int, 10> coll; // содержится "мусор"
    array<int, 10> coll= {}; //инициализация нулями
  
// выводим на экран все элементы
    for_each(coll.cbegin(), coll.cend(), // диапазон
    print); // операция
    cout << endl;
}


Еще раз извиняюсь Да, кстати наверное можно попробовать вывести элементы массива, используя лямбда - выражения, функциональные объекты но сам я таким извра... такими экспериментами никогда не занимался
1
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
11.03.2018, 18:21
Цитата Сообщение от lkruk Посмотреть сообщение
как можно обойти это или никак?
Никак. Вам это уже 100 раз написали. Если количество элементов известно только при выполнении программы то можно std::vector использовать, но std::array никак нельзя.
0
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 94
14.03.2018, 02:23  [ТС]
Recrut_rf, спасибо большое за объяснение,тут я решил изменить программу ,чтобы вводить с клавиатуры элементы.

Есть вопрос.Как сделать проверку на перестановку? Я понимаю,я ее сделал в своем прошлом коде,но может есть другой способ.

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
   /*Дан целочисленный массив размера N. 
   Если он является перестановкой, то есть содержит все числа от 1 до N, 
   то вывести 0; в противном случае вывести номер первого недопустимого элемента
*/
 
 
 
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <string>
#include <fstream>
#include <windows.h>
#include <cstring>
#include <array>
 
using namespace std;
 
template <class T, size_t N>
class array;
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    const int N=10;
    
    std::array <int, N> arr;
    for(int i=0; i<N; i++)
    {
    cout << "Введите значение элемента массива " <<"[A" << i <<"]" << ": ";
    cin >> arr[i];
    cout<<"[A"<<i<<"]"<<" = "<<arr[i]<<endl;
    
}
    for (int i=0; i<N; i++) {
        if(arr[i]=i+1) {
        cout << "0";
        };
        if(arr[i]!=i+1) {
         cout << "Данный масиив не является последовательностью";
        };
    }
 
    system("pause");
    return 0;
}
0
14.03.2018, 06:59

Не по теме:

Цитата Сообщение от Recrut_rf Посмотреть сообщение
проверка выхода за пределы контейнера - чуть ли не единственное исключение
std::bad_cast, std::bad_typeid, std::string, std::regex, std::locale, строковые функции(например, std::stoi), std::bad_alloc, std::filesystem, std::optional, std::any, std::variant, std::future, std::function, std::shared_ptr.
да куча их.
http://en.cppreference.com/w/cpp/error/exception

0
 Аватар для Recrut_rf
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
14.03.2018, 09:03
Цитата Сообщение от GbaLog- Посмотреть сообщение
да куча их
<stdexcept>, <exception> - по сути отдельные части STL никак с контейнерами не связанные, а я имел ввиду только то, что реализовано в самих контейнерах <bitset>, <deque>, <list>, <vector> и т. д.. А в них кроме как проверки выхода за пределы ничего особо то и не реализовано (по крайней мере я помню только про выход за пределы, и то только при использовании с контейнерами функции at() ).

Добавлено через 25 минут
Цитата Сообщение от lkruk Посмотреть сообщение
template <class T, size_t N> class array;
А вот это для чего?
Цитата Сообщение от lkruk Посмотреть сообщение
Как сделать проверку на перестановку?
Возможно в самом контейнере <array> есть необходимый метод, возможно подобная проверка реализована в виде алгоритма STL. Лично я не помню. Если мне что-нибудь вдруг необходимо сделать подобное - я изучаю справочное руководство по STL чтобы самому не "изобретать велосипед". К примеру пару месяцев назад надо было сделать случайный вывод последовательности чисел, причём цифры этой последовательности не должны были повторяться - нашёл нужный раздел "помозговал" немного и сделал.

Добавлено через 13 минут
Цитата Сообщение от lkruk Посмотреть сообщение
Как сделать проверку на перестановку?
Лично я что-нибудь по-мозговал бы, но в данный момент я на работе, а на работе у меня всё "по Jave" Плюсцы остались дома на компе
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.03.2018, 09:03
Помогаю со студенческими работами здесь

3D геометрия с использованием STL
Уважаемые, подскажите пожалуйста. Сам пишу на другом языке, но возникла необходимость срочно разобраться в задаче на С++. Нужно создать...

Библиотека STL, + задача с её использованием
Доброго времени суток, о существовании библиотеки шаблонов я узнал 2 недели назад. У меня есть задача: Но это глобальная задача,...

с использованием массивов (array)
Задачи надо написать на С. 1) - Дан массив A размера N. Вывести вначале его элементы с чётными номерами ( в порядке возрастания...

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

Разработать программу с использованием трех алгоритмов stl
Нужно разработать программу на языке С++ с использованием трех алгоритмов STL. Буду очень признателен:)


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru