Re[7]: Проблемы STL-контейнеров
От: Kluev  
Дата: 08.09.06 09:08
Оценка: 1 (1) -3
Здравствуйте, 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 контейнеров достаточно знать указатель на элемент. Лишние сущности не нужны.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.