Всем известные, простые массивы в С++ можно представить как контейнеры, а значит они могут обрабатываться с помощью алгоритмов 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;
}
Результат:
Вывели массив на экран с помощью copy(): 4 23 -4 0 21 12
Как вы уже заметили, myArray — это простой массив С++, это не контейнер STL. Однако мы смогли его обработать с помощью функции copy(). В строке 10 мы вызвали функцию copy(), которой передали в параметрах три значения:
- первое — указатель на первый элемент массива, не забывайте, что имя массива — это указатель на его первый элемент.
- второе — указатель на последний элемент массива, так как в массиве 6 элементов, то не сложно определить последний.
- третье — это итератор потока вывода, именно туда мы и отправили массив.
В итераторе указан тип 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;
}
Результат работы программы:
Отсортированный массив: -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. Он не позволяет выполнять недопустимые операции над массивом, в отличие от обычных указателей, а значит интерфейсная оболочка безопаснее в этом плане. Однако такой интерфейсный класс нужно определять самим, либо подключать специальные библиотеки, в которых он определен. В стандартной библиотеке его нет, по крайней мере я его не нашел.
Комментарии
Fird
Прошу прощения, все работает. У меня руки кривые просто.
Fird
sort(myArray, myArray+6) — не работает (аргумент типа int не совместим с параметром типа size_t
Что делать? О_О