2016-03-05 3 views
2

У меня есть итератор, который тяжелее, чем int или указатель (он предназначен для итерации по ближайшим соседям сайта в трехмерной периодической решетке, поэтому он должен содержать определенные частные структуры поддержки). Чтобы определить, находится ли итератор в конце контейнера, мне нужно только одно сравнение, но для создания итератора, указывающего на один конец, мне нужно было бы также создать конструкторские возможности.Должны ли методы begin() и end() в контейнере иметь одинаковый тип возврата?

Таким образом, я полагал, что я мог бы иметь end() mehtod контейнера возвращает int, а затем перегрузить operator==(), чтобы избежать создания полного один пришедших конечный итератора. This answer намекает, что это может быть хорошей идеей. Для двунаправленных итераторов это кажется неправильным, поскольку я позже узнал (от, например, this question), что все, что возвращается end(), должно быть декрементирующим до последнего элемента.

Поскольку мой итератор только вперед, я думал, что все будет хорошо, но теперь я считаю, что не могу использовать std::find() (и, возможно, другие алгоритмы STL), который ожидает два аргумента одного и того же (итератора) типа.

Итак, мой вопрос: имеет ли end() тип, отличный от begin(), нарушение стандартного поведения? Это такая плохая идея?

ответ

6

Они должны быть одного типа.

Изменение этого раздела является одним из главных предложений наиболее обнадеживающих предложений. Это не очень хорошее требование, но оно требуется, по крайней мере, на данный момент.

+0

очень чистый. Я не согласен со стандартом, поэтому я могу ожидать, что его сожгут. Если есть разговоры об изменении, я думаю, что то, что я пытался сделать, было не такой плохой идеей. Будет ли изменение применяться также для пересылки итератора? Кажется, что требование об уменьшении от конца() сильно сталкивается с этой попыткой оптимизации. – TomasG

+1

Это изменение относится ко всем категориям итераторов AFAIK. Я думаю, требование о возможности уменьшения конца() будет отброшено. – Puppy

Смежные вопросы