Всем известные, простые массивы в С++ можно представить как контейнеры, а значит они могут обрабатываться с помощью алгоритмов 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
Что делать? О_О