LINUX.ORG.RU

C++ итераторы


0

1

Где-то документировано что инкремент итератора, указывающего на end() даёт begin(), а декремент - последний элемент? Или это вообще не гарантируется?

★★★★★

> инкремент итератора, указывающего на end() даёт begin(),

а декремент - последний элемент?


Это такая шутка?

archimag ★★★
()

стоит почитать умные книжки по STL, да.

mono ★★★★★
()

Это «теоретическое предположение» или «из практики»?

Если второе, то как Вам это удалось?!?!?!

OldFatMan
()

Единственный источник которому стоит доверять это стандарт языка С++. Описанного вами поведения итераторов я в стандарте не встречал.

anonymous
()
Ответ на: комментарий от Eddy_Em

> Нафиг, нафиг...

Прочитайте уже хотя бы для того, чтобы откровенных глупостей не постить .

anonymous
()

Неужели 2011 год объявили годом C/C++? Откуда такой всплеск топиков по С/C++?

anonymous
()
Ответ на: комментарий от anonymous

> Неужели 2011 год объявили годом C/C++? Откуда такой всплеск топиков по С/C++?

лоровцы наконец-то решили заняться делом, а не написанием очередного вычисления факториала на маргинальных языках

anonymous
()
Ответ на: комментарий от anonymous

> Единственный источник которому стоит доверять это стандарт языка С++.

Ага, особенно в местах про, которые из него выпали.

Аноним, неужели единственное, что ты прочитал и запомнил — это стандарт C++, что ты постоянно всюду им тыкаешь?

unanimous ★★★★★
()

>Где-то документировано что инкремент итератора, указывающего на end() даёт begin()
Внезапно! Откуда дрови^Wтрава?

unikoid ★★★
()
Ответ на: комментарий от unanimous

> Аноним, неужели единственное, что ты прочитал и запомнил — это стандарт C++, что ты постоянно всюду им тыкаешь?

У вас есть другой первоисточник информации по С++?

anonymous
()
Ответ на: комментарий от unanimous

> Ага, особенно в местах про, которые из него выпали.

Интересно, какой источник информации восполняет эти пробелы?

anonymous
()
Ответ на: комментарий от anonymous

> Интересно, какой источник информации восполняет эти пробелы?

Очевидно, их заполняют особенности реализации. Некоторые писатели компиляторов даже специально их документируют.

unanimous ★★★★★
()

Где-то документировано что инкремент итератора, указывающего на end() даёт begin(), а декремент - последний элемент? Или это вообще не гарантируется?

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

anonymous
()

Для stl::list::iterator это действительно так, но вообще то итераторы встречаются много где, и ждать такого поведения от всех итераторов я бы не стал;-)

AIv ★★★★★
()

Именно для std::list::iterator. Оно работает, но меня интересует насколько можно на это опираться и насколько это справедливо для других контейнеров.

slovazap ★★★★★
() автор топика
Ответ на: комментарий от slovazap

Ну тупым методом проб устанавливается, что для stl::map и stl::vector это не так. Кроме того, как выше отмечалось для обычного массива это тоже не так. Для list это IMHO скорее баг чем фича, некая особенность реализации - во вяком случае я ничего такого в описании не припоминаю.

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

AIv ★★★★★
()
Ответ на: комментарий от slovazap

> насколько можно на это опираться

Опираться на это ни в коем случае нельзя. Стандарт определяет итераторы ввода, вывода, однонаправленные, двунаправленные, произвольного доступа. Никаких «циклических» итераторов Стандарт не определяет.

ilias
()
Ответ на: комментарий от dave

Не понимаю, причем тут это. Типа, если бы ошибка не возникала, так и пользоваться можно? А если потом собрать с другой реализацией STL, где итераторы внутри не циклические и ошибки наружу моментально не выходят?

ilias
()
Ответ на: комментарий от dave

Негатива не было, было непонимание.

Насколько я знаю, реализация GNU использует как циклические итераторы. Если отладочная версия GNU STL предупреждает о подобных ошибках, то это правильно.

К слову, итераторы являются шаблонами, то есть не могут быть скомпилированы сами по себе, без инстанцирования. Что нужно сделать, чтобы воспользоваться отладочной версией STL?

ilias
()
Ответ на: комментарий от ilias

Таких отладочных версий STL может быть несколько. Например, STLport в режиме отладки вставляет некоторые проверки.

dave ★★★★★
()

Ожидаемо оно должно падать с исключением, но на практике иногда вылезает странное поведение да. А посему верить только стандартам

jreznot
()

В итоге-то что? Гнушники насрали отсебятины без документации (в M$-стиле), или вы просто не знаете где документацию искать? Не там я вопрос задал, видимо.

slovazap ★★★★★
() автор топика
Ответ на: комментарий от archimag

> Верить вообще ничему нельзя.

Да, верить ничему и никому нельзя. Мне можно.

ilias
()

Где-то документировано что инкремент итератора, указывающего на end() даёт begin(), а декремент - последний элемент?

Это нигде не документировано. Это чьи-то фантазии.

Или это вообще не гарантируется?

Раздел 24.1.1, таблица 72:

Operation: ++r
Type: X&
Semantic, pre/post conditions: pre: r is dereferenceable; post: r is dereferenceable or r is past-the-end; post: any copies of the previous value of r are no longer required either to be dereferenceable or to be in the domain of ==.

Предусловие: должна быть применима операция разыменования. К итератору past-the-end операция разыменования не применима, потому как «The library never assumes that past-the-end values are dereferenceable».

Для описания операции декремента см. таблицу 75 раздела 24.1.4.

ilias
()
Ответ на: комментарий от ilias

> Semantic, pre/post conditions: pre: r is dereferenceable; post: r is dereferenceable or r is past-the-end

Во, это то что я хотел. Спасибо.

slovazap ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.