Программирование >>  Операторы преобразования типа 

1 ... 29 30 31 [ 32 ] 33 34 35 ... 239


pos25 = poS;

pos35 = find (++pos, coll.endO. Интервал 35); Значение

break; case 35:

Первым обнаружен элемент со значением 35 pos35 = pos:

pos25 = find C++pos. coll.endO. Интервал 25); Значение

break; default:

Элементы со значениями 25 и 35 не найдены break;

В качестве критерия поиска передается специальное выражение для нахождения первого элемента со значением 25 или 35. В этом выражении объединены несколько стандартных объектов функций (см. с. 140 и 305) и вспомогательный объект функции compose f gx hx, описанный на с. 316.

Использование нескольких интервалов

Некоторые алгоритмы работают сразу с несколькими интервалами. Обычно в таких случаях задаются начало и конец только одного интервала, а для остальных интервалов задается только начало. Конечная позиция других интервалов определяется по количеству элементов в первом интервале. Например, следующий вызов equal() поэлементно сравнивает все содержимое коллекции colli с элементами со112, начиная с первого:

if (equal (colli.beginO. colli.endO. cQll2.begin()) {

Таким образом, количество элементов со112, сравниваемых с элементами colli, косвенно определяется количеством элементов в colli.

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

Рассмотрим следующую программу:

stl/copyl.cpp finclude <iostream> Iinclude <vector> Iinclude <list>



#include <algor1thm> using namespace std;

int mainO

11st<int> colU: vector<int> C0112;

Вставка элементов со значениями от 1 до 9 for Сint i=l: i<=9; ++1) { colli,push back(i);

ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ:

- перезапись несуществующих элементов в приемнике сору (colli,beginC), colli.end(). Источник coll2.beginO); Приемник

...

В приведенном примере вызывается алгоритм сору(), который просто копирует все элементы первого интервала во второй (приемный) интервал. Как обычно, для первого интервала определяются обе границы, а для второго - только нач;1Л0. Но данный алгоритм производит перезапись элементов вместо вставки, поэтому он требует, чтобы количество злементов п приемном интервале было достаточным для перезаписи. Если элементов пе хватит (как в приведенном примере), последствия будут непредсказуемыми. На практике это часто означает перезапись данных, находящихся в памяти после coll2.end(). Если повезет, произойдет сбой программы; по крайней мере, вы будете знать, что случилось что-то не то. Впрочем, вы можете упростить себе жизнь н воспользоваться безопасной версией STL, в которой неопределенное поведение автоматически приводит к выполнению некоторой процедуры обработки ошибок (см. с. 146).

Чтобы избежать подобных ошибок, либо убедитесь, что приемный интервал имеет достаточные размеры, либо воспользуйтесь итераторами вшаош. Итераторы вставки рассматриваются на с. 116. Снач;1яа посмотрим, как изменить приемный интервал и обеспечить наличие в нем необходимого количества элементов.

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

stl/copy2.cpp #include <iostream> #include <vector> #include <l1st>



Iinclude <dGquG> Iinclude <algorithm> using namespace std:

Int mainO {

list<int> colli: vector<int> coll2;

Вставка элементов со значениями от 1 до 9 for (int 1=1: 1<=9: ++i) { colli.push back(i):

Изменение размера приемного интервала.

чтобы он были достаточен для работы алгоритма

с перезаписью,

С0112. resize (colli.sIzeO):

/* Копирование зпементов из первой коллекции во вторую

* - перезапись существующих элементов в приемном интервале */

сору (colli.beginO . colli.endO. Источник coll2.beginO); Приемник

/* Создание третьей коллекции с необходимым количеством элементов

* - исходный размер передается в параметре */

deque<int> col 13(со1 U.sizeO);

Копирование зпементов из первой коллекции в третью сору (colli.beginO. colli.endO. Источник соИЗ.beginO): Приемник

Размеры существующего контейнера со112 изменяются функцией resize():

C0112.resize (colli.sizeO):

Коллекция соПЗ инициализируется с явным заданием начального размера, чтобы количество элементов в ней соответствовало количеству элементов в colli:

deque<1nt> coll3(colll.size());

Как при изменении размеров, так и при инициализации с заданным размером создаются новые элементы. Эти элементы инициализируются конструктором по умолчанию, поскольку их создание происходит без передачи аргументов. Передача дополнительного аргумента конструктору и функции resize() позволяет инициализировать новые элементы.



1 ... 29 30 31 [ 32 ] 33 34 35 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика