Возврат Итераторов вместо самого Контейнера, когда необходим доступ к Контейнеру - PullRequest
3 голосов
/ 22 декабря 2011

В моей программе в нескольких местах мне нужно получить доступ и изменить структуру данных std :: map. Прямо сейчас у меня есть метод с именем getMap () , который по существу возвращает ссылку на std :: map. Я думаю о возвращении итераторов в std :: map вместо самой карты для лучшей инкапсуляции и производительности. Является ли хорошей идеей сделать что-то подобное или вернуть карту так же хорошо, как вернуть итераторы в отношении инкапсуляции и производительности?

Ответы [ 3 ]

0 голосов
/ 22 декабря 2011

Я думаю, что вы уменьшаете полезность своей функции, когда возвращаете итераторы всей карты. Потребитель функции может просто написать getMap (). Begin (), чтобы получить итератор. С другой стороны, они могут вообще не интересоваться элементами, они могут захотеть clear() it или swap() it.

Однако, когда выводится некоторое подмножество коллекции, например, диапазон или некоторые элементы, выбранные предикатом, возвращать данные через выходной итератор гораздо лучше, чем возвращать уменьшенную коллекцию.

Стандартная библиотека делает это постоянно, например, copy() алгоритм:

template<class InputIterator, class OutputIterator>
    OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
{
    while (first!=last) *result++ = *first++;
    return result;
}

Здесь result может добавлять элементы в другой класс коллекции (с помощью back_inserter), выводить на экран или даже обрабатывать элементы, не сохраняя их где-либо, например. вычисление статистики по предмету в коллекции.

0 голосов
/ 22 декабря 2011

Я делал то же самое в прошлом, но теперь предпочитаю возвращать ссылку на всю коллекцию. Я беспокоюсь о том, что итераторы остаются в силе. Например, если я использую итератор для удаления записи, они все еще действительны или мне нужно получить их снова? Возвращение коллекции - это как разоблачение, но я чувствую, что это безопаснее.

0 голосов
/ 22 декабря 2011

Если вам действительно нужна ссылка на map, тогда зачем возвращать итераторы?

Если вам нужно указать на определенную часть карты, итераторы не всегда хорошо инкапсулируютони представляют собой «обратный» произвольный доступ ... ваша вызывающая подпрограмма может хотеть быть защищенной от таких деталей, и обычные итераторы не обеспечивают такую ​​защиту).boost::range может обеспечить лучшее решение.

С некоторыми другими контейнерами (например, вектором) итераторы будут недействительными, если другая подпрограмма модифицирует контейнер перед использованием.В зависимости от семантики вашей программы вы можете подумать, что это нарушает инкапсуляцию.

...