Обычные массивы в качестве STL-контейнеров

Всем известные, простые массивы в С++ можно представить как контейнеры, а значит они могут обрабатываться с помощью алгоритмов STL. Конечно же обычные массивы не будут обладать функционалом классов, ведь массивы — не классы, но все же кое-что с массивами делать можно.
Каким же образом реализуется такой подход? Например, чтобы выполнить какой-то поиск по массиву или отсортировать его, в первую очередь, необходимо данному алгоритму передать итераторы массива. Очень хорошо, что в STL, интерфейс итераторов реализован как указатель. А значит обычные указатели также являются итераторами и могут быть использованы в алгоритмах STL. К примеру, давайте рассмотрим простой код, который выводит массив на экран используя функцию copy().

#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    int myArray[] = {4, 23, -4, 0, 21, 12};

    cout << "Вывели массив на экран с помощью copy(): ";
    copy(myArray, myArray+6, ostream_iterator<int>(cout," "));
    return 0;
}

Результат:

CppStudio.com
Вывели массив на экран с помощью copy(): 4 23 -4 0 21 12

Как вы уже заметили, myArray — это простой массив С++, это не контейнер STL. Однако мы смогли его обработать с помощью функции copy(). В строке 10 мы вызвали функцию copy(), которой передали в параметрах три значения:

  1. первое — указатель на первый элемент массива, не забывайте, что имя массива — это указатель на его первый элемент.
  2. второе — указатель на последний элемент массива, так как в массиве 6 элементов, то не сложно определить последний.
  3. третье — это итератор потока вывода, именно туда мы и отправили массив.


В итераторе указан тип int, так как массив этого типа, кроме того, в круглых скобках указан поток вывода — cout и указан символ пробела в кавычках. Символ пробела будет разделять между собой элементы массива. Кроме того, можно пользоваться различными алгоритмами STL, например — сортировкой. Давайте немного доработаем предыдущий пример программы. Вот код:

#include <iostream>
#include <iterator>
#include <algorithm> // подключаем заголовок с алгоритмами STL
using namespace std;

int main()
{
    int myArray[] = {4, 23, -4, 0, 21, 12};

    sort(myArray, myArray+6); // сортировка обычного массива с помощью алгоритма STL
    cout << "Отсортированный массив: ";
    copy(myArray, myArray+6, ostream_iterator<int>(cout," "));
    return 0;
}

Результат работы программы:

CppStudio.com
Отсортированный массив: -4 0 4 12 21 23

Из результата работы программы хорошо видно, что массив отсортирован как надо, функция сортировки вызывается в строке 10, в качестве параметров, функции sort() мы передаем два итератора массива myArray. Чтобы воспользоваться функцией сортировки sort(), не забываем подключить заголовочный файл #include <algorithm>. Кстати, по умолчанию, функция sort() сортирует по возрастанию. Чтобы это изменить, объявите функцию на подобие этой:

// эта функция нужна для сортировки массива по возрастанию
bool moreCriteria(int a, int b) {
 return ( a > b );
}

После этого просто передайте в алгоритм sort(), имя функции с критерием сортировки, вот так это делается:

sort(myArray, myArray+6, moreCriteria); // сортировка обычного массива с помощью алгоритма STL по убыванию

Если снова захотите поменять критерий сортировки, то это можно сделать, изменив знак > на знак <, в строке 3.

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

Автор: Marienko L.
Дата: 16.01.2014
Поделиться:

Комментарии

  1. Fird

    Прошу прощения, все работает. У меня руки кривые просто.

  2. Fird

    sort(myArray, myArray+6) — не работает (аргумент типа int не совместим с параметром типа size_t

    Что делать? О_О

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.