Здравствуйте, kan, Вы писали:
kan>Kluev wrote: >> kan>А зачем такой ужас писать? Чем банальный >> >> kan>for(size_t i = 0; i + 1 < vec.size(); i++) >> kan>не устраивает? >> Такая форма записи неестественная и не соотвествует ходу мышления. kan>Мышление переделай. Но запись абсолютно естественна — проверить, что выражение "i+1", которое мы используем как индекс не выходит за пределы размера вектора.
Ничего естесвенного в такой записи нет, это просто вынужденный воркэраунд вокруг беззнаковых типов.
Условие в цикле должно быть простым и ясным: итерировать отсюда и до сюда. "i+1" добавляет третье условие которое программист учитывать при чтении кода. Четвертое условие которе так же прийдется иметь ввиду чтобы не наступить на грабли — беззнаковость size_t.
kan> А что означает "i < vec.size() — 1", особенно в случае нулевого размера?
Означает итерировать все кроме последнего. Читается точно так же как и думается.
kan>Ещё прошу заметить, что понятие отрицательного индекса — вообще противоестественна, а поэтому может трактоваться по kan>разному. Например, в перле, обратиться по индексу "-2" — валидная операция, означает взять второй элемент с конца.
Пусть в перле делают как хотят, а в с++ индексация связана с адрессной арифметикой и поэтому должна иметь аналогичное поведение. В адресной арифметике отрицательные индексы совершенно естественны (указатель может указывать на середину массива)
>>> > Для того чтобы можно было писать по человечески. Если например двигаемся >>> > в произвольном направлении и с произвольным шагом, то к индексу >> kan>Для этого есть iterator. >> С итераторами неудобно работать. >> 1) они становятся невалидными после ресайза >> 2) программу неудобно отлаживать, т.к. итератор ничего не говорит ни о >> номере итерации, ни о индексе элемента в массиве.
kan>Индекс для вектора всегда "iter — vec.begin()"
В отладчике это как посмотреть? Или условный брейкпоинт поставить? В общем случае никак.
kan>В общем, какие-то надуманные проблемы, чаще всего возникающие от недопонимания понятия "итератор".
Итераторы — это костыли и грабли под видом красивой идеи. Для массивов — лучше юзать индексы, для интрузивных node-based контейнеров достаточно знать указатель на элемент. Лишние сущности не нужны.