Мне бы пришлось использовать какую-то функцию для копирования данных, начиная с некоторого диапазона адресов. Есть идеи, как это сделать?
Стандартная библиотека C ++ имеет алгоритм копирования. Это называется std::copy
. Если вы не можете использовать стандартную библиотеку, вы можете реализовать тот же алгоритм, используя цикл, оператор присваивания и арифметику указателя.
не создает ли массив символов, способных удерживать 500 символов, пустую трата памяти по сравнению со строкой?
Да.
Если да, то как решается проблема в языке Си, где нет строкового класса?
Подобно тому, как реализован сам std::string
; В конце концов, std::string
нельзя использовать для реализации std::string
. Хотя базовая структура данных std::string
может быть реализована в C так же, как и в C ++, способ получения и освобождения памяти несколько отличается, поскольку в C нет классов или исключений.
Строка - это просто особый случай последовательности объектов - это последовательность символов. Существует несколько структур данных с изменяемым размером, которые могут представлять последовательность. Например, std::string
и std::vector
реализованы с использованием структуры данных, называемой «динамический массив».
Динамический массив реализован с использованием указателя, который указывает на динамически размещенный массив, и записи о размере этого массива, а также указателя на последний вставленный элемент (или, альтернативно, количество элементов). Если выделенное пространство заканчивается, выделяется новый, больший динамический массив, содержимое старого массива копируется, а старый освобождается. Важно увеличивать массив с геометрической скоростью, чтобы достичь постоянной асимптотической сложности (амортизированной) для операции вставки.