Шаг 187.
Библиотека STL. Контейнеры STL. Обычные массивы как контейнеры STL. Непосредственное использование обычного массива

    На этом шаге мы рассмотрим пример использования обычного массива.

    Обычные массивы могут использоваться как контейнеры STL. Однако обычный массив не является классом, поэтому он не содержит функций begin() и end() и для него невозможно определять функции. В таких случаях приходится использовать либо пассивный подход, либо интерфейсные классы.

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

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <conio.h> //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}


int main(int argc, char* argv[])
{
  int coll[] = { 5, 6, 2, 4, 1, 3 };

  // Возведение элементов в квадрат
  transform (coll, coll+6,       // Первый источник
             coll,               // Второй источник
             coll,               // Приемник
             multiplies<int>()); // Операция

  // Сортировка выполняется, начиная со второго элемента 
  sort (coll+1,coll+6);

  // Вывод всех элементов 
  cout << ToRus("Квадраты чисел:\n");
  copy (coll,coll+6,
        ostream_iterator<int>(cout," ")); 
  cout << endl;

  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Будьте внимательны и правильно передайте конец массива, как это сделано в нашем примере (coll+6). Как обычно, конец интервала находится в позиции за последним элементом.

    Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

    На следующем шаге мы рассмотрим интерфейсный класс для массива.




Предыдущий шаг Содержание Следующий шаг