Если у вас длинные строки и производительность критична, то вы можете застревать в специальном контейнере, который заключает в себе что-то вроде параллели vector<string>
и set<string *>
.Предоставьте пользовательский компаратор для набора, чтобы он разыменовывал указатель для сравнения.Чтобы изменить элемент, удалите указатель из набора, измените строку, а затем снова вставьте указатель.
Это немного запутанно, когда вы хотите удалить элементы контейнера, поэтому вы захотите использовать некоторую форму lazyудаление.В этот момент вы очень близки к полноценному пулу свободных объектов для ваших строк.
Если вы используете вектор строк в критичном для производительности коде, то следите за перераспределением векторов, котороевручную скопируйте каждую строку в новый фрагмент памяти.Вы можете обойти это, наблюдая за предстоящим перераспределением, создавая новый вектор пустых строк (предварительно зарезервированный для двойного размера), а затем используя string :: swap для каждого элемента, чтобы переместить старые данные в новый большой вектор.
Все станет намного лучше, когда семантика перемещения c ++ 0x станет широко доступной.