Во-первых, вы должны заранее знать размер массива. В общем случае это требование невыполнимо, хотя иногда вы знаете, что количество элементов не может превысить некоторое число. Однако те же вирусы успешно используют такие предположения программиста о количестве элементов массива, делая их ошибочными и заставляя программу выполнить запись за пределами массива. Не имеется также никакого иного способа увеличить массив, кроме как объявить новый массив и перенести в него содержимое старого массива меньшего размера.
Во-вторых, вставка элементов в произвольное место массива влечёт за собой копирование элементов внутри массива. Это достаточно дорогостоящая операция как с точки зрения используемой памяти, так и процессорного времени. Сортировка же элементов в пределах массива ещё более дорогостояща.
В настоящее время в состав С++ входит стандартная библиотека шаблонов ( Standard Template Library , STL), включающая множество различных типов контейнеров, каждый из которых обладает своими достоинствами ( и, само собой, недостатками ).

«STL — весьма объёмная библиотека с массой сложно реализованных контейнеров. Весь приведённый здесь материал следует рассматривать как беглое знакомство лишь с некоторыми возможностями STL.»
[ Советы ]
Наиболее распространённым типом массива, по-видимому, является нуль-завершённая строка, используемая для вывода текста. В ней наиболее ярко проявляются как достоинства, так и недостатки массивов. Взгляните, насколько просто выглядит следующее выражение:
cout << "Это обычная строка" ;
_________________
317 стр. Глава 28. Стандартная библиотека шаблонов
А вот как выглядит конкатенация двух строк:
char* concatString( char* s1 , char* s2 )
{
int length = strlen( s1 ) + strlen( s2 ) + 1 ;
char* s = new char[ length ] ;
strcpy( s , s1 ) ;
strcat( s , s2 ) ;
return s ;
}
Для работы со строками STL предоставляет контейнер string . Этот класс предоставляет программисту массу операций ( включая перегруженные операторы ), которые упрощают работу со строками символов. Та же конкатенация строк с использованием класса string выглядит гораздо проще:
string concat( string s1 , string s2 )
{
return s1 + s2 ;
}

«До сих пор в программах я старался избегать использования классаstring , поскольку вы ещё с ним не знакомы. Однако большинство программистов используют этот класс гораздо чаще, чем массивы символов с завершающим нулевым элементом.»
[ Помни! ]
Приведённая далее программа демонстрирует несколько возможностей класса string .
/* STLString — демонстрация простейших */
/* возможностей класса string из STL */
#include
#include
#include
using namespace std ;
/* concat — конкатенация двух строк */
string concat( string s1 , string s2 )
{
return s1 + s2 ;
}
/* removeSpaces — удаление всех пробелов из строки */
string removeSpaces( string s )
{
/* Находим смещение первого пробела; продолжаем поиск до тех пор, пока не сможем найти больше ни одного пробела */
size_t offset ;
while ( ( offset = s.find( " " ) ) != -1 )
{
/* Удаляем найденный пробел */
s.erase( offset , 1 ) ;
}
return s ;
}
/* insertPhrase — вставка фразы в том месте, где находится метка */
string insertPhrase( string source )
{
_________________
318 стр. Часть 5. Полезные особенности
size_t offset = source.find( "" ) ;
if ( offset != -1 )
{
source.erase( offset , 4 ) ;
source.insert( offset , "Randall" ) ;
}
return source ;
}
int main( int argc , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
/* Создаём строку, которая представляет собой конкатенацию двух меньших строк */
cout << "string1 + string2 = "
<< concat( "string1 " , "string2" )
<< endl ;
/* Создаём тестовую строку и удаляем в ней все пробелы */
string s2( "The phrase" ) ;
cout << "<" << s2 << "> минус пробелы = <"
<< removeSpaces( s2 ) << ">" << endl ;
/* Вставляем фразу в средину существующей строки */
string s3 = "Stephen Davis" ;
cout << s3 + " -> " + insertPhrase( s3 ) << endl ;
Читать дальше