почему reverse_iterator не может назначить новое значение, используя форвардный итератор?

109
13

мы можем создать новый reverse_iterator из итератора:

set<int>::iterator fiter = si.begin();
set<int>::reverse_iterator rsiter(fiter);

но мы не можем назначить ему новый форвардный итератор:

rsiter = fiter;    //cannot compile

есть ли причина для этого?

спросил(а) 2014-01-25T06:09:00+04:00 6 лет, 10 месяцев назад
1
Решение
92

Как говорит Дэвид Родригес - dribeas в своем комментарии, нет необходимости перегружать оператор присваивания, когда вы можете просто использовать оператор присваивания копий. auto чтобы уменьшить типизацию.

auto rsiter = std::set<int>::reverse_iterator(fiter);

ответил(а) 2014-01-25T07:01:00+04:00 6 лет, 10 месяцев назад
42

reverse_iterator - это адаптер итератора.

iterator - это итератор.

Было бы нецелесообразно, если бы вы могли назначить итератор адаптеру: они не одно и то же. C++ позволяет передавать итератор адаптера для адаптации:

// adapter rsiter can adapt iterator fiter
reverse_iterator rsiter(fiter);

ответил(а) 2014-01-25T06:24:00+04:00 6 лет, 10 месяцев назад
42

Из документации reverse_iteraor

explicit reverse_iterator( Iterator x );

Конструктор explicit, что означает, что он не может быть вызван неявно, делая что-то вроде:

set<int>::reverse_iterator reverse_iterator it = si.begin(); // error

Вы всегда должны вызывать конструктор явно:

set<int>::reverse_iterator reverse_iterator it(si.begin()); // works

operator=() перегрузки operator=() не выглядит продуктивным IMO, он просто путает интерфейс.

ответил(а) 2014-01-25T06:20:00+04:00 6 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема