Выбрать главу

bool operator==(three_d a, three_d b)

{

 return (a.x + a.у + a.z) == (b.x + b.y + b.z);

}

int main()

{

 vector<three_d> v;

 unsigned int i;

 // Добавляем в вектор объекты.

 for(i=0; i<10; i++)

  v.push_back(three_d(i, i+2, i-3));

 // Отображаем содержимое вектора.

 for(i=0; i<v.size(); i++)

  cout << v[i];

 cout << endl;

 // Модифицируем объекты в векторе.

 for(i=0; i<v.size(); i++) v [i] = v[i] + 10;

 // Отображаем содержимое модифицированного вектора.

 for(i=0; i<v.size(); i++) cout << v[i];

 return 0;

}

Эта программа генерирует такие результаты.

0, 2, -3

1, 3, -2

2, 4, -1

3, 5, 0

5, 7, 2

6, 8, 3

7, 9, 4

8, 10, 5

9, 11, 6

10, 12, 7

11, 13, 8

12, 14, 9

13, 15, 10

14, 16, 11

15, 17, 12

16, 18, 13

17, 19, 14

18, 20, 15

19, 21, 16 

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

О пользе итераторов

Частично сила библиотеки STL обусловлена тем, что многие ее функции используют итераторы. Этот факт позволяет выполнять операции с двумя контейнерами одновременно. Рассмотрим, например, такой формат векторной функции insert().

template <class InIter>

void insert(iterator i, InIter start, InIter end);

Эта функция вставляет исходную последовательность, определенную параметрами start и end, в приемную последовательность, начиная с позиции i. При этом нет никаких требований, чтобы итератор i относился к тому же вектору, с которым связаны итераторы start и end. Таким образом, используя эту версию функции insert(), можно один вектор вставить в другой. Рассмотрим пример.

// Вставляем один вектор в другой.

#include <iostream>

#include <vector>

using namespace std;

int main()

{

 vector<char> v, v2;

 unsigned int i;

 for(i=0; i<10; i++) v.push_back('A' + i);

 // Отображаем исходное содержимое вектора.

 cout << "Исходное содержимое вектора:\n";

 for(i=0; i<v.size(); i++)

  cout << v[i] << " ";

 cout << endl << endl;

 // Инициализируем второй вектор.

 char str[] = "-STL — это сила!-";

 for(i=0; str[i]; i++) v2 .push_back (str [i]);

 /* Получаем итераторы для середины вектора v, а также начала и конца вектора v2. */

 vector<char>::iterator р = v.begin()+5;

 <char>::iterator p2start = v2.begin();

 vector<char>::iterator p2end = v2.end();

 // Вставляем вектор v2 в вектор v.

 v.insert(p, p2start, p2end);

 // Отображаем результат вставки.

 cout << "Содержимое вектора v после вставки:\n";

 for(i=0; i<v.size(); i++) cout << v[i] << " ";

 return 0;

}

При выполнении эта программа генерирует следующие результаты.

Исходное содержимое вектора:

A B C D E F G H I J