stl — безопасно ли в C ++ вычитать из container.end ()?

То есть при условии, что 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 Поведение кода, если есть.

5

Решение

std::vector возвращается итераторы с произвольным доступом, так что да, это безопасно с vector,

std::list возвращается двунаправленные итераторы. Они могут быть увеличены (++) и уменьшилось (--), но не учитывают произвольную арифметику (+, -) или относительные сравнения (>, <). Это не безопасно с list,

Ты можешь использовать std::advance на двунаправленных итераторах для продвижения или перемотки произвольных сумм. В C ++ 11 вы можете использовать std::prev на месте iter - 1,

7

Другие решения

Стандарт C ++ говорит, что std::vector<T>::iterator является итератор произвольного доступа указывая на последний элемент. Так что вы можете безопасно использовать - а также + операторы.

В отличие от std::vector, std::list<T>::iterator является двунаправленный итератор только поддержка -- а также ++ операторы.

3

По вопросам рекламы [email protected]