STL: Перегрузка разыменования и взятия адреса. Итераторы: сущность и классификация
Перегрузка оператора - один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.
struct Complex {
Complex( double r, double i ) : re(r), im(i) {}
Complex operator+( Complex &other );
void Display( ) { cout << re << ", " << im << endl; }
private:
double re, im;
};
// Перегрузка оператора сложения
Complex Complex::operator+( Complex &other ) {
return Complex( re + other.re, im + other.im );
}
Взятие адреса переменной осуществляется унарным оператором &: &temp - вернёт адрес переменной temp
Чтобы получить значение, записанное в некоторой области, на которое ссылается указатель нужно воспользоваться операцией разыменования указателя : `temp - вернёт значение по адресу temp`
Итератор - средство доступа к содержимому отдельных объектов в контейнере.
Классификация итераторов:
- Входной итератор (op++, op+, op->, op=, op==, op!=) - используется для перебора (только чтение) элементов только с начала в конец. Самый простой пример использования итератора ввода — вывести на экран элементы массива.
- Выходной итератор (op++, op+) - доступ в одном направлении (с конца в начало) для записи. Разыменовывать такие итераторы нужно только для того, чтобы присвоить некое значение объекту, на который итератор ссылается.
- Однонаправленный (op++, op+, op->, op=, op==, op!=) - объединяет итераторы входа и выхода, осуществляет чтение и запись в одном направлении.
- Двунаправленный (op++, op--, op->, op=, op==, op!=) - то же, что и однонаправленный итератор, позволяющий осуществлять перебор в обе стороны.
- Произвольного доступа (op++, op--, op->, op=, op==, op!=, op+=, op-=, op<, op>, op[]) - даёт доступ к любому элементу контейнера.