Не совсем.
std::string
не является POD, оно не хранит свое содержимое "внутри объекта". Более того - даже не требуется хранить его содержимое в одном блоке памяти.
Также для std::vector
(как и для всех массивов) необходимо, чтобы его содержимое было одного типа (= одинакового размера), поэтому вы не можете создать буквальный «массив» строк различной длины.
Ваш лучший снимок - взять длину и использовать std::vector<std::array<char, N> >
Если вам нужны действительно разные длины, альтернативой является просто std::vector<char>
для данных плюс std::vector<unsigned>
для индексов, где начинаются последовательные строки.
Свернуть свой собственный распределитель для строки - заманчивая идея, вы можете основать его на std::vector<char>
, а затем свернуть на нем свой собственный std::basic_string
, а затем собрать их.
Обратите внимание, что вы на самом деле сильно зависите от конкретной реализации std::string
. Некоторые из них имеют внутренний буфер из N символов и выделяют память только снаружи, если длина строки больше, чем у буфера. Если это так в вашей реализации, вы все равно не получите непрерывную память для всего буфера строк.
Исходя из этого, я заключаю, что с std::string
вы, как правило, не сможете выполнить то, что хотите (если вы не полагаетесь на конкретную реализацию STL), и вам нужно предоставить другую строковую реализацию, соответствующую вашим потребностям.