.end() и .push_back()

Тема в разделе "LANGS.C", создана пользователем _DEN_, 26 апр 2009.

  1. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Y_Mur
    Код (Text):
    1. #define _SECURE_SCL FALSE
    2. #include <vector>
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    green
    Попробовал - ничего не изменилось - совсем.
     
  3. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Y_Mur
    Не может быть. Может ты 2 раза #include <vector> делаешь? Проверь stdafx.h и т.п.
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    green
    Да точно это #include <iostream> до #define _SECURE_SCL FALSE картину портило - но всё равно гибкости маловато - получается включать/выключать эту проверку по мере её реальной необходимости нельзя - только для всего модуля и для всех stl объектов раз и навсегда.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    green
    Соглашусь, иногда полезная фича. Но всё же я пока не решусь такое использовать, заюзаю присваивание в цикле.

    Y_Mur
    А как иначе добиться максимальной эффективности?
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Booster
    Имхо ничего не мешает определять макрос-флажок типа #define _SECURE_SCL FALSE/TRUE в любом месте программы так чтобы он действовал только на нужный блок методов объекта, до следующего такого макроса и не вижу причин по которым к одним и тем же данным объекта нельзя было бы обращаться как с проверкой так и без.
    А так получается что при включенной проверке временно отключить её можно только путём обращения к вектору как к массиву. К тому же если проверка нужна например в iostream, то и в vector её не отключишь - где же тут максимальная эффективность? Хотя всё равно спасибо green за подсказку - в большинстве случаев действительно ничего не мешает отключить её раз и навсегда.
     
  7. agrischuk

    agrischuk New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2009
    Сообщения:
    47
    Книжки читать пробовали? Настоятельно рекомендую:
    C++ Standard Library - A Tutorial and Reference

    по теме invalidate iterators.

    Ну если на стандарт потянуло, то открываем ISO 14882-1998,
    смотрим 23.2.4.3 Vector modifiers и 23.2.2.3 List modifiers.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    agrischuk

    Бугага)))
     
  9. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Из требований к random access iterator. Ты давно вырос из подобных вопросов, не заставляй людей за тебя искать в стандарте ) Всё равно такой код вряд ли пишут, индексы безопаснее...

    Проверка выполняется только в at().
     
  10. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    Гарантирует, но эта гарантия распространяется только на итераторы, которые ссылаются на элементы, находящие _до_ точки вставки. Поэтому вызов функций 'std::vector<T>::push_back' (ее семантика определена как 'vec.insert(vec.end(), value)' и любых форм 'insert' инвалирует итератор, который до этого возвращала функция 'end()'. Наличие или отсутствие реаллокации на этот аспект поведения никак не влияет.
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    nop_

    То есть .end, ставший валидным, это просто "так уж вышло"?
     
  12. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    Наличие признаков, по которым был сделан такой вывод ("ставший валидным") - это результат undefined behaviour.
     
  13. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Народ, я не пойму, а что собственно требуется? Может этого можно добиться и без жестокого ковыряния в деталях реализации? :)