|
Программирование >> Немодифицирующие последовательные алгоритмы
и необязательный параметр, задающий значение для элементов, содержащихся во вновь созданном контейнере. Например, мы можем написать 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 ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |