std::map и operator []

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

  1. _DEN_

    _DEN_ DEN

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

    std::map это бинарное дерево. operator [] это просто сахар.


    q_q

    Меня никто не гипнотизировал. Я просто не понимаю, почему не сделано то, что можно было сделать. На счет питфолов я уже сказал - можно выкинуть ошибку, это будет вполне законно и предсказуемо.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _DEN_
    Ну, а если опустить подробности реализации и взглянуть на интерфейс и поведение?
     
  3. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Мне кажется, не сделано, чтобы не вносить путаницы: для перегрузки только по const это слишком большая разница в семантике.
     
  4. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    _DEN_
    ИМХО:
    operator[] вроде никогда не генерирует исключения (только при нехватке памяти или из-за пользовательского конструктора). Поэтому и здесь не стали делать исключение, просто запретили данную функцию.
    Хотя с точки зрения удобства это, безусловно, большой минус map'ов.

    q_q
    Всё это только мои предположения, частично основанные на исходниках STL.
    Вообще, на эту тему наверняка что-то написано в книгах, но сейчас у меня нет времени :dntknw:
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    IceStudent
    "доступ к произвольному элементу" - это традиционное понимание работы квадратных скобочек, а "наращивая ... если запрашиваемого элемента не оказалось" - это бонус, в традиционной модели следует ожидать out of range.

    _DEN_
    почему не сделано то, что можно было сделать
    А нужно ли? Согласуется ли это с парадигмой map? Какую цену (не каждый согласится на "можно выкинуть ошибку") придется заплатить за желание получить традиционные квадратные скобки? Востребован ли вообще этот оператор для контейнера map или следует заменить не константную версию на map::update и не путать программистов?