Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 5 6 7 [ 8 ] 9 10 11 ... 78


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

vector<int> v(5, 8) Пять элементов, все они равны 8. или

vector<int> v(5);

В последнем случае вектор v будет содержать пять элементов. Эта форма записи удобна в том случае, когда мы хотим присвоить значения элементам позже, как в примере из раздела 1.6.

1.5. Алгоритм find

Следующая программа показывает, как мы можем находить требуемое значение в векторе:

findl.cpp: Найти заданное значение в векторе. #include <iostream> #include <vector> #include <algorithm> using namespace std;

int mainO { vector<int> v; int x;

cout Enter positive integers, followed by 0:\n ; while (cin x, x != 0) v.push back(x);

cout Value to be searched for: ; cin x;

vector<int>::iterator i =

f ind(v.begin() , v.endO, x) ; if (i == V.endO )

cout Not found\n ; else

{ cout Found ; if (i == v.begin())

cout as the first element ; else cout after *--i;

cout endl; return 0;

Алгоритм yiW применим к каждому из четырех последовательных контейнеров (вектор, двусторонняя очередь, список и массив). Если мы везде заменим vector на deque, поведение программы не изменится, как и в случае, если мы заменим vector на list. Версия для массива целочисленных значений приведена ниже:



find2.cpp: Найти заданное значение в массиве. #include <iostream> #include <algorithm> using namespace std;

int main()

{ int a[10], X, n = 0;

cout Enter at most 10 positive integers,

followed by 0:\n ; while (cin x, x != 0 && n < 10) a[n++] = x; cout Value to be searched for: ; cin x;

int *p = find(a, a+n, x); if (p == a+n)

cout Not found\n ; else

{ cout Found ; if (P == a)

cout as the first element ; else cout after *--p;

cout endl; return 0;

1.6. Алгоритм copy и итератор вставки

Мы можем использовать алгоритм сору для копирования элементов одного контейнера в другой, причем, например, источником может быть вектор, а приемником - список, как показывает следующая программа:

copyl.cpp: Копируем вектор в список.

Первая версия: режим замещения.

#include <iostream>

#include <vector>

#include <list>

using namespace std;

int main()

{ int a[4] = {10, 20, 30, 40}; vector<int> v(a, a+4);

list<int> L(4); Список из 4 элементов

copy (v. begin О , v.endO, L.beginO); list<int>::iterator i; for (i=L.begin() ; i != L.endO; + + i)

cout *i ; Результат: 10 20 30 40 cout endl; return 0;



Режимы замещения и вставки

Поскольку в список L необходимо скопировать четыре элемента, при его определении ему задана длина 4:

list<int> L(4); Список из 4 элементов.

Это необходимо, поскольку алгоритм сору, когда его используют таким способом, работает в режиме замещения. Это напоминает то, как вводятся символы с клавиатуры при наборе текста в режиме замещения. В этом режиме мы пишем поверх имеющегося текста; многие, однако, предпочитают режим вставки. На обычной клавиатуре клавиша Ins переключает режим вставки в режим замещения и обратно. Что касается алгоритма сору, то для него также не составит труда перейти в режим вставки. Попробуем начать с пустого списка, заменив вышеприведенное определение L на следующее:

list<int> L; Пустой список.

Затем заменим вызов алгоритма сору на следующий:

сору (v. begin О , v.endO, inserter(L, L.beginO));

С этими двумя изменениями программы содержимое списка L станет таким же, как и в изначальной версии. Новая запись

inserter (...)

зовется итератором вставки, который является особым видом адаптера итератора, о чем рассказано в разделе 6.6. Мы можем также использовать его, чтобы вставить данные в середину последовательности, как показывает следующая версия:

сору2.срр: Копируем вектор в список.

Вторая версия: режим вставки.

#include <iostream> #include <vector> iinclude <list> using namespace std;

int mainO

{ int a[4] = {10, 20, 30, 40}; vector<int> v(a, a+4);

list<int> L(5, 123); Список из 5 элементов list<int>: :iterator i = L.beginO; ++i; ++i;

copy (v.beginO , v.endO, inserter (L, i)); for (i=L.begin() ; i != L.endO; + + i) cout *i ;



1 ... 5 6 7 [ 8 ] 9 10 11 ... 78

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