Связь между итераторами и контейнерами в STL - PullRequest
2 голосов
/ 10 февраля 2010

Добрый день,

Предположим, что я пишу Python-подобный диапазон на C ++. Он предоставляет все характеристики контейнеров произвольного доступа (конечно, неизменных). У меня возникает вопрос о следующей ситуации:

У меня есть два разных итератора, которые указывают на разные экземпляры контейнера диапазона. Дело в том, что эти два диапазона равны . то есть они представляют один и тот же диапазон. Вы позволите следующую ситуацию:

fact: range1 == range2 e.g.
---------------------------
range range1(10, 20, 1), range2((10, 20, 1);
range::iterator i = range1.begin(), j = range2.begin();
assert(i == j); // would you allow this?

Извините, если мне не хватает простого правила проектирования в STL:)

Ответы [ 3 ]

3 голосов
/ 10 февраля 2010

По умолчанию в STL два итератора из двух разных контейнеров не сравнимы. Это означает, что поведение не определено. Так что делай, что хочешь, никто даже не должен пытаться.

редактировать

Внимательно изучив стандарт, в разделе 24.1, пункт 6 говорится:

Итератор j называется достижимым из итератор я, если и только если есть конечная последовательность приложений выражение ++ i, которое делает i == j. Если j достижим от i, они относятся в тот же контейнер.

Это означает, что если вы разрешите i == j с i и j в двух разных контейнерах, вы действительно будете считать оба контейнера одинаковыми. Поскольку они неизменны, это прекрасно. Просто вопрос о семантике.

1 голос
/ 10 февраля 2010

Возможно, вы захотите проверить boost::counting_iterator. В сочетании с boost::iterator_range вы получите что-то, аналогичное вашему классу диапазона (за исключением того, что он допускает только шаг размером 1):

auto rng = boost::make_iterator_range(boost::make_counting_iterator(0),
                                      boost::make_counting_iterator(10));
for(auto it = rng.begin(), e = rng.end(); it != e; ++it)
    std::cout << it << " "; // Prints 0,1,2,3,...,9

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

0 голосов
/ 10 февраля 2010

В STL правила сравнения определяются элементами контейнера, а не самим контейнером, поэтому, по моему мнению, вы не должны выполнять разыменование себя при перегрузке оператора ==.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...