/* Отображаем содержимое вектора после удаления символов. */

 cout << "Размер вектора после удаления символов = "<< v.size() << endl;

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

 for(i=0; i

 cout << endl;

 return 0;

}

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

Размер = 10

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

A B C D E F G H I J

Размер вектора после вставки = 20

Содержимое вектора после вставки:

A B X X X X X X X X X X C D E F G H I J

Размер вектора после удаления символов = 10

Содержимое вектора после удаления символов:

A B C D E F G H I J

Сохранение в векторе объектов класса

В предыдущих примерах векторы служили для хранения значений только встроенных типов, но этим их возможности не ограничиваются. В вектор можно помещать объекты любого типа, включая объекты классов, создаваемых программистом. Рассмотрим пример, в котором вектор используется для хранения объектов класса three_d. Обратите внимание на то, что в этом классе определяются конструктор по умолчанию и перегруженные версии операторов "<" и "==". Имейте в виду, что, возможно, вам придется определить и другие операторы сравнения. Это зависит от того, как используемый вами компилятор реализует библиотеку STL.

// Хранение в векторе объектов класса.

#include

#include

using namespace std;

class three_d {

  int x, y, z;

 public:

  three_d() { x = у = z = 0; }

  three_d(int a, int b, int с) { x = a; у = b; z = c; }

  three_d &operator+(int a) {

   x += a;

   у += a;

   z += a;

   return *this;

  }

  friend ostream &operator<<(ostream &stream, three_d obj);

  friend bool operator<(three_d a, three_d b);

  friend bool operator==(three_d a, three_d b);

};

/* Отображаем координаты X, Y, Z с помощью оператора вывода для класса three_d. */

ostream &operator<<(ostream &stream, three_d obj)

{

 stream << obj.x << ", ";

 stream << obj.у << ", ";

 stream << obj.z << "\n";

 return stream;

}

bool operator<(three_d a, three_d b)

{

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

}

bool operator==(three_d a, three_d b)

{

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

}

int main()

{

 vector v;

 unsigned int i;

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

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

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

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

 for(i=0; i

  cout << v[i];

 cout << endl;

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

 for(i=0; i

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

 for(i=0; 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

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

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги