Общее понятие итератора STL. Итератор возвращающий значение "за пределом".
Уважаемые учащиеся ниже Вы сможете увидеть ответ, перед тем, как ответить, пожалуйста, постарайтесь написать для себя ответ на черновике, и только потом сравните наш ответ с Вашим:
Верно ли наше решение?
Ответ:
STL (Standart Template Librаry) - библиотека, ставшая первым масштабным шагом к упрощению работы программиста, содержащая наиболее часто употребляемые конструкции, шаблоны функций, "объемные ящики" предназначенные для хранения важной информации(упорядоченной или неупорядоченной, например:vector, list, multiset...), доступ к данным которых осуществляется через заранее прописанные методы-функции (предполагающие для начала создание определенных классов с методами шаблонизированного типа).
Для начала хотелось бы отметить, что главным атрибутом STL является итератор - удобная обертка для указателей, выполненных как шаблоны классов. Кстати говоря, обычный указатель тоже можно считать итератором, правда, очень примитивным. Итераторы обладают массой достоинств, например таких, как автоматическое отслеживание размера типа, на который указывает итератор, или автоматизированные операции инкремента и декремента для перехода от элемента к элементу. Именно благодаря этим возможностям итераторы и являются фундаментом всей библиотеки.
Чтобы было более понятно, можно привести пример вывода элементов массива, состоящего из 5 элементов:
пусть у нас имеется массив чисел, которые нужно распечатать. Тогда программа печати с использованием for_each может выглядеть так:
#include
#include
using namespace std;
void printValue(int num)
{
cout << num << "\n";
}
main(void)
{
int init[] = {1, 2, 3, 4, 5};
for_each(init, init + 5, printValue);
}
Вызывается алгоритм for_each, ему в качестве входных итераторов передаются указатели на начало массива и на адрес, следующий за концом массива, т. е. на значение "за пределами". Третьим параметром является указатель на функцию printValue, которая печатает элементы массива. Чтобы включить в программу возможность использования потоков, добавляется включаемый файл iostream, а для описания прототипа алгоритма for_each в программу включается заголовочный файл algorithm (algorith для продуктов Borland). Обязательным при использовании STL является использование директивы using namespace std, включающей пространство имен библиотеки STL.
А теперь продолжим знакомство с итераторами. Итераторы можно условно разделить на две категории: основные и вспомогательные. Но прежде чем перейти к подробному описанию и тех и других, необходимо остановиться на двух важных правилах работы с итераторами: получение итераторов и отслеживания значения "за пределом". Многие функции и методы классов STL возвращают итераторы, вместо того чтобы производить действия над обычными указателями С++. Классы STL, хранящие информацию, возвратят итератор, указывающий на первый элемент данных, если вызвать их метод begin(). Напротив, вызов метода end() приводит к возврату значения "за пределом" (past-the-end). Так называется значение итератора, при котором он указывает на элемент, следующий за последним разрешенным для ссылки элементом. Начиная со значения "за пределом", находится область данных, из которой нельзя читать и куда нельзя записывать. Нарушение этого запрета приведет к непредсказуемому результату. Представьте себе массив, например, из 10 элементов. Если итератор ссылается на некий одиннадцатый элемент, то говорят, что он ссылается на значение "за пределом". Разумеется, попытка записать в несуществующий элемент данные или оперировать данными этого элемента, как достоверными, приведет к неопределенному результату. Если бы вы попытались проделать такую операцию с блоком памяти в среде Windows, то немедленно получили бы исключение выхода за предел, что, скорее всего, окончилось бы аварийным завершением программы. Вот и судите сами, насколько важно следить за значением "за пределом".Каждый итератор взаимозаменяем, необходимо лишь учитывать иерархию:
1) двунаправленный итератор;
2) однонаправленный итератор;
3-4) соответственно итератор ввода и вывода;
Из всего вышеизложенного хотела бы отметить, что использование STL требует от нас повышенного внимания, так как корректное использование шаблонов - это итог надлежащей работы как на практике так и в теории.Надеюсь было познавательно, спасибо за внимание.
Общее понятие итератора STL. Итератор возвращающий значение "за пределом".
Уважаемые учащиеся ниже Вы сможете увидеть ответ, перед тем, как ответить, пожалуйста, постарайтесь написать для себя ответ на черновике, и только потом сравните наш ответ с Вашим:
Верно ли наше решение?
Ответ:
STL (Standart Template Librаry) - библиотека, ставшая первым масштабным шагом к упрощению работы программиста, содержащая наиболее часто употребляемые конструкции, шаблоны функций, "объемные ящики" предназначенные для хранения важной информации(упорядоченной или неупорядоченной, например:vector, list, multiset...), доступ к данным которых осуществляется через заранее прописанные методы-функции (предполагающие для начала создание определенных классов с методами шаблонизированного типа).
Для начала хотелось бы отметить, что главным атрибутом STL является итератор - удобная обертка для указателей, выполненных как шаблоны классов. Кстати говоря, обычный указатель тоже можно считать итератором, правда, очень примитивным. Итераторы обладают массой достоинств, например таких, как автоматическое отслеживание размера типа, на который указывает итератор, или автоматизированные операции инкремента и декремента для перехода от элемента к элементу. Именно благодаря этим возможностям итераторы и являются фундаментом всей библиотеки.
Чтобы было более понятно, можно привести пример вывода элементов массива, состоящего из 5 элементов:
пусть у нас имеется массив чисел, которые нужно распечатать. Тогда программа печати с использованием for_each может выглядеть так:
#include
#include
using namespace std;
void printValue(int num)
{
cout << num << "\n";
}
main(void)
{
int init[] = {1, 2, 3, 4, 5};
for_each(init, init + 5, printValue);
}
Вызывается алгоритм for_each, ему в качестве входных итераторов передаются указатели на начало массива и на адрес, следующий за концом массива, т. е. на значение "за пределами". Третьим параметром является указатель на функцию printValue, которая печатает элементы массива. Чтобы включить в программу возможность использования потоков, добавляется включаемый файл iostream, а для описания прототипа алгоритма for_each в программу включается заголовочный файл algorithm (algorith для продуктов Borland). Обязательным при использовании STL является использование директивы using namespace std, включающей пространство имен библиотеки STL.
А теперь продолжим знакомство с итераторами. Итераторы можно условно разделить на две категории: основные и вспомогательные. Но прежде чем перейти к подробному описанию и тех и других, необходимо остановиться на двух важных правилах работы с итераторами: получение итераторов и отслеживания значения "за пределом". Многие функции и методы классов STL возвращают итераторы, вместо того чтобы производить действия над обычными указателями С++. Классы STL, хранящие информацию, возвратят итератор, указывающий на первый элемент данных, если вызвать их метод begin(). Напротив, вызов метода end() приводит к возврату значения "за пределом" (past-the-end). Так называется значение итератора, при котором он указывает на элемент, следующий за последним разрешенным для ссылки элементом. Начиная со значения "за пределом", находится область данных, из которой нельзя читать и куда нельзя записывать. Нарушение этого запрета приведет к непредсказуемому результату. Представьте себе массив, например, из 10 элементов. Если итератор ссылается на некий одиннадцатый элемент, то говорят, что он ссылается на значение "за пределом". Разумеется, попытка записать в несуществующий элемент данные или оперировать данными этого элемента, как достоверными, приведет к неопределенному результату. Если бы вы попытались проделать такую операцию с блоком памяти в среде Windows, то немедленно получили бы исключение выхода за предел, что, скорее всего, окончилось бы аварийным завершением программы. Вот и судите сами, насколько важно следить за значением "за пределом".Каждый итератор взаимозаменяем, необходимо лишь учитывать иерархию:
1) двунаправленный итератор;
2) однонаправленный итератор;
3-4) соответственно итератор ввода и вывода;
Из всего вышеизложенного хотела бы отметить, что использование STL требует от нас повышенного внимания, так как корректное использование шаблонов - это итог надлежащей работы как на практике так и в теории.Надеюсь было познавательно, спасибо за внимание.