Перевыделение памяти

309
14 июня 2017, 02:51

Делаю программу считывания с файла слов. Заранее не знаю сколько слов будет в файле, по этому нужен динамический массив, который будет увеличивать свою вместимость по мере считывания. В С есть функция realloc, которая позволяет это делать без проблем. Как такое реализовать в С++? И можно ли смешивать оператор new вместе с realloc? Насколько это будет правильно работать?

Answer 1

В Си и Си++ существенно различаются подходы к управлению памятью. В частности, вам не нужно вручную беспокоиться и последовательно выделять память для растущего массива. Это уже умеет библиотечный шаблонный класс std::vector — этакий динамический массив.

Ваша задача чтения слов из файла решается в две строчки: открытие файла и собственно чтение, которое производится с помощью итераторов (а-ля указатели).

ifstream f("слова.txt");
vector<string> words((istream_iterator<string>(f)), istream_iterator<string>());

Если первый аргумент конструктора std::vector не взять в скобки, вся строчка будет интерпретирована как объявление функции, а не объекта.

Использование:

cout << "Вот первое слово: " << words[0];
cout << "Всего прочитано слов: " << words.size();

А благодаря автоматическому вызову деструктора при достижении конца блока, в котором объявлен вектор, память освобождается сама. Дополнительно ничего писать не надо.

Answer 2

std::vector - это массив с динамическим размером. Не нужно придумывать велосипед, найдите пример его использования и примените у себя.

READ ALSO
Как правильно создать модель Qt

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

В данном вопросе речь пойдет о QAbstractListModel, а точнее, о проблеме возникшей при использовании данного класса в MapItemViewСразу перейдем к коду:

417
Ошибка компиляции в codeblocks

Ошибка компиляции в codeblocks

g++/Code::Blocks/Ubuntu Gnome При попытке компиляции из codeblocks указанного ниже кода вылетает ошибкаНо любопытен тот факт, что выполнение тех же команд...

322
Приоритет перегрузки операторов

Приоритет перегрузки операторов

Почему перегрузка операторов через методы класса приоритетней чем через функции?

200