81. Предпочитайте операции с диапазонами операциям с отдельными элементами
81. Предпочитайте операции с диапазонами операциям с отдельными элементами
Резюме
При добавлении элементов в контейнер лучше использовать операции с диапазонами (т.е. функцию insert, которая получает пару итераторов), а не последовательность вызовов функции для вставки одного элемента. Вызов функции для диапазона обычно проще написать, легче читать, и он более эффективен, чем явный цикл (см. также рекомендацию 84).
Обсуждение
Чем больший контекст передается функции, тем больше вероятность того, что она сможет лучше распорядиться полученной информацией. В частности, когда вы вызываете функцию и передаете ей пару итераторов, указывающих некоторый диапазон, она может выполнить оптимизацию, основанную на знании количества объектов, которые должны быть добавлены (вычисляемое как distance(first, last)).
To же самое можно сказать и об операциях "повторить n раз", например, о конструкторе vector, который получает количество повторений и значение.
Примеры
Пример 1. vector::insert. Пусть вам надо добавить n элементов в vector v. Многократный вызов v.insert(position,x) может привести к неоднократному перераспределению памяти, когда вектор v имеет недостаточно места для размещения нового элемента. Что еще хуже, вставка каждого отдельного элемента имеет линейное время работы, поскольку она должна перенести ряд элементов, чтобы освободить требуемую позицию для вставляемого элемента, а это приводит к тому, что вставка n элементов при помощи последовательных вызовов имеет квадратичное время работы! Конечно, избежать проблемы множественного перераспределения памяти можно при помощи вызова reserve, но это не снизит количества перемещений элементов и квадратичное время работы такого алгоритма. Быстрее и проще ясно сказать, что вам надо: v.insert(position,first,last), где first и last — итераторы, определяющие диапазон элементов, которые должны быть добавлены в v. (Если first и last — входные итераторы, то возможности определить размер диапазона перед его действительным проходом нет, так что вектору v может потребоваться многократное перераспределение памяти; тем не менее, версия для вставки диапазона все равно скорее всего будет более производительной, чем вставка отдельных элементов.)
Пример 2. Создание и присваивание диапазона. Вызов конструктора (или функции присваивания), который получает диапазон итераторов, обычно выполняется быстрее, чем вызов конструктора по умолчанию (или функции clear) с последующими индивидуальными вставками в контейнер.
Ссылки
[Meyers01] §5 • [Stroustrup00] §16.3.8
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Операции с элементами каталогов
Операции с элементами каталогов Структура dentry_operations содержит методы, которые подсистема VFS может вызывать для элементов каталогов определенной файловой системы. Эта структура определена в файле <linux/dcache.h> следующим образом.struct dentry_operations { int (*d_revalidate)(struct dentry*, int); int
10.3.3. Доступ по операциям
10.3.3. Доступ по операциям Помимо этого, в файле ftpaccess может быть описание основных операций и прав доступа к ним. В общем виде это выглядит следующим образом:Действие yes|no пользовательВ качестве действия можно указать одно из следующих значений: chmod, delete, overwrite, rename или umask.
Глава 10 Техника работы с отдельными инструментами
Глава 10 Техника работы с отдельными инструментами В данной теме мы не будем подробно рассматривать технику работы со всеми инструментами, присутствующими на панели инструментов. Ограничимся несколькими. Ранее вы познакомились с инструментом Кисть, а также узнали, что
Работа с отдельными ячейками диапазона
Работа с отдельными ячейками диапазона Хотя можно с помощью одного оператора назначить одно значение всем ячейкам диапазона, как показано в предыдущем примере, в Excel нет метода, позволяющего с помощью единственного действия изменять имеющиеся значения многоячеечного
Урок № 38. Формирование отчетности по кассовым операциям
Урок № 38. Формирование отчетности по кассовым операциям В программе ”1С:Бухгалтерия 8” реализованы широкие функциональные возможности по настройке и формированию самых разных отчетов. Для перехода в режим работы с отчетами предназначены соответствующие команды меню
Урок № 45. Формирование отчетности по банковским операциям
Урок № 45. Формирование отчетности по банковским операциям На этом уроке мы научимся быстро формировать отчетность по движению и остаткам денежных средств на банковском счете предприятия.Как мы уже знаем, для перехода в режим быстрого формирования отчетности
Урок № 64. Формирование отчетности по складским операциям
Урок № 64. Формирование отчетности по складским операциям Для быстрого формирования отчетности по складским операциям на вкладке Склад панели функций имеются соответствующие ссылки (рис. 8.14). Рис. 8.14. Панель функций, вкладка СкладС их помощью вы можете сформировать
Урок № 73. Формирование отчетности по производственным операциям
Урок № 73. Формирование отчетности по производственным операциям Для быстрого формирования отчетности по производственным операциям на вкладке Производство панели функций имеются соответствующие ссылки (рис. 9.27). Рис. 9.27. Панель функций, вкладка ПроизводствоС их
28. Предпочитайте канонический вид ++ и --, и вызов префиксных операторов
28. Предпочитайте канонический вид ++ и --, и вызов префиксных операторов РезюмеОсобенность операторов инкремента и декремента состоит в том, что у них есть префиксная и постфиксная формы с немного отличающейся семантикой. Определяйте операторы operator++ и operator-- так, чтобы они
33. Предпочитайте минимальные классы монолитным
33. Предпочитайте минимальные классы монолитным РезюмеРазделяй и властвуй: небольшие классы легче писать, тестировать и использовать. Они также применимы в большем количестве ситуаций. Предпочитайте такие небольшие классы, которые воплощают простые концепции, классам,
34. Предпочитайте композицию наследованию
34. Предпочитайте композицию наследованию РезюмеИзбегайте "налога на наследство": наследование — вторая по силе после отношения дружбы взаимосвязь, которую можно выразить в С++. Сильные связи нежелательны, и их следует избегать везде, где только можно. Таким образом,
36. Предпочитайте предоставление абстрактных интерфейсов
36. Предпочитайте предоставление абстрактных интерфейсов РезюмеВы любите абстракционизм? Абстрактные интерфейсы помогают вам сосредоточиться на проблемах правильного абстрагирования, не вдаваясь в детали реализации или управления состояниями. Предпочтительно
48. В конструкторах предпочитайте инициализацию присваиванию
48. В конструкторах предпочитайте инициализацию присваиванию РезюмеВ конструкторах использование инициализации вместо присваивания для установки значений переменных-членов предохраняет от ненужной работы времени выполнения при том же объеме вводимого исходного
55. Предпочитайте канонический вид присваивания
55. Предпочитайте канонический вид присваивания РезюмеПри реализации оператора operator= предпочитайте использовать канонический вид — невиртуальный с определенной сигнатурой.ОбсуждениеПредпочтительно объявлять копирующее присваивание для типа T с одной из следующих
Урок 6.2. Работа с ячейками, диапазонами и листами
Урок 6.2. Работа с ячейками, диапазонами и листами Выделение ячеек При выполнении той или иной операции возникает необходимость выделить несколько ячеек или их диапазон. Чаще всего используется выделение прямоугольной области ячеек с помощью кнопки мыши. Это делается
Практическая работа 43. Операции с ячейками, диапазонами и листами
Практическая работа 43. Операции с ячейками, диапазонами и листами Задание. Научиться выполнять различные операции с ячейками и диапазонами.Последовательность выполнения1. Откройте книгу Товары, сохраненную в предыдущем уроке.2. Выделите диапазон, строку, столбец так, как