Я стараюсь максимально скрыть базовые реализации моих контейнеров.
Так что в вашем примере я бы начал с использования typedef вместо прямой ссылки на вектор (позже вы поймете, почему):
typedef std::vector<string> MyStringCollection;
Затем я попытаюсь использовать конструкции, которые как можно меньше полагаются на базовую реализацию.В этом случае я хочу перебрать контейнер и использовать значения в контейнере, например:
for(MyStringCollection::iterator it=mycollection.begin(); it!=mycollection.end(); ++it)
{
// use *it
}
С помощью typedef пользователи вашей коллекции должны использовать только MyStringCollection::iterator
без необходимости знатьчто такое MyStringCollection.
Обратите внимание, что в C ++ 0x вы можете использовать auto
, что еще короче (что делает мой аргумент для typedef менее актуальным).
Преимуществотеперь стало довольно легко изменить MyStringCollection с std :: vector на std :: list.Если по соображениям производительности вы решили, что список лучше подходит, вам нужно только:
- Заменить typedef с std :: vector на std :: list
- Иметьбыстрый просмотр всех мест, где используется MyStringCollection (это будет легче найти, чем поискать все применения std :: vector