То есть при условии, что container
не пусто, могу ли я безопасно сделать это:
std::vector<int> container;
container.push_back( 0xFACE8D );
auto last = container.end() - 1;
и это:
РЕДАКТИРОВАТЬ: заменено -1
с --
Вот:
std::list<int> container;
container.insert( 0xFACE8D );
auto last = container.end();
--last;
и опять для произвольного непустого контейнера?
РЕДАКТИРОВАТЬ: позвольте мне уточнить вопрос.
Иногда совершенно законный кодекс ведет себя некорректно. Вопрос в том, что при условии, что приведенный выше код компилируется, безопасно ли делать что-то подобное?
Это должно быть безопасно для обычных массивов в стиле C, потому что соответствующие итераторы являются просто указателями. Но безопасно ли это для более сложных контейнеров?
Предположим, что один реализует список с итераторами, как этот:
class MyListIterator {
MyListIterator *prev, *next;
MyListIterator * operator--() { return prev; }
...
};
class MyList {
MyListIterator *end() { return NULL; }
...
};
Затем попытка уменьшить container::end()
Несмотря на то, что синтаксически он абсолютно легален, он может стать причиной ошибки.
Я надеюсь, однако, что stl
контейнеры намного умнее, чем это. Таким образом, вопрос о гарантиях по вышеуказанному stl::list
Поведение кода, если есть.
std::vector
возвращается итераторы с произвольным доступом, так что да, это безопасно с vector
,
std::list
возвращается двунаправленные итераторы. Они могут быть увеличены (++
) и уменьшилось (--
), но не учитывают произвольную арифметику (+
, -
) или относительные сравнения (>
, <
). Это не безопасно с list
,
Ты можешь использовать std::advance
на двунаправленных итераторах для продвижения или перемотки произвольных сумм. В C ++ 11 вы можете использовать std::prev
на месте iter - 1
,
Стандарт C ++ говорит, что std::vector<T>::iterator
является итератор произвольного доступа указывая на последний элемент. Так что вы можете безопасно использовать -
а также +
операторы.
В отличие от std::vector
, std::list<T>::iterator
является двунаправленный итератор только поддержка --
а также ++
операторы.