@parkito

Как организовать динамический символьный массив в с++?

Здравствуйте, помогите пожалуйста разобраться со следующим вопросом.
Мне нужно чтобы все символы из фала или введенные пользователем поместились в массив. Я думаю, что для этого нужно использовать динамический массив. Но каким образом придумать не могу. Как - то нужно сосчитать количество символов --> выделить память --> инициализировать массив. В голову приходит
#include<iostream>
#include<cstdlib>
 
int main()
{
    char *arr;
    int size;
    setlocale(LC_ALL, "Russian");
    std::cout<<"Введите размер массива :"<<std::endl;
    std::cin>>size;
    arr = new char[size];
    std::cout<<"Заполните массив :"<<std::endl;
    for (int i = 0; i < size; i++)
        std::cin>>arr[i];
    std::cout<<std::endl;
    for (int i = 0; i < size; i++)
        std::cout<<" "<<arr[i];
    delete [] arr;
}

Но количество элементов может быть сверх большим или малым.
  • Вопрос задан
  • 8598 просмотров
Пригласить эксперта
Ответы на вопрос 3
barmaley_exe
@barmaley_exe
В общем случае нельзя предугадать, сколько элементов будет в массиве (можно оценить это значение сверху, но может быть крайне неэкономно), поэтому используется концепция расширяющихся массивов: имеется предвыделенный массив заданного размера, который заполняется по мере работы программы. Как только массив заполнен и места больше нет, а нужно вставить ешё один элемент, создается новый массив большей ёмкости, туда копируется содержимое старого, а элемент вставляется в новый массив. Старый после этого удаляется.

Так реализован std::vector, например.
Ответ написан
Комментировать
@Espleth
Можете использовать, как написали выше, векторы.
Выглядит это так:
#include <vector> //понадобится include
vector<char> arr; //объявляем его. длину вводить не обязательно
char c;
cin >> c;
arr.push_back(c); //вводим элементы
int length = arr.size(); //количество символов

Дальше работаем как с обычным массивом.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
в контексте задачи списки выглядят уместнее... (обычные такие списки на указателях). Либо realloc.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы