Там нет необходимости для std::map<K, V>
, чтобы обеспечить итераторы для ключей и/или значений: например итератор может быть легко построен на основе существующего итератора (с). Ну, это не так просто, как нужно/может быть, но это, безусловно, выполнимо. Я знаю, что у Boost есть библиотека итераторных адаптеров.
Реальный вопрос: почему стандартная библиотека C++ не предоставляет итератор-адаптеры для проектных итераторов? Короткий ответ, на мой взгляд, потому что, в общем, вы не хотите изменять итератор, чтобы выбрать доступ к свойствам! Вы скорее хотите проецировать или, что более общее, преобразовать доступное значение, но по-прежнему придерживаться того же понятия позиции. Сформулированные разные, я думаю, что необходимо отделить понятие позиционирования (то есть продвигать итератор и проверять, действительно ли их позиция) от доступа к свойствам в данной позиции. Подход, который я себе это будет выглядеть следующим образом:
std::for_each(m_map.key_pm(), m_map.begin(), m_map.end(), &func);
или, если вы знаете, что основная структура, полученная из итератора карты содержат является std::pair<K const, V>
(как это имеет место для std::map<K, V>
, но не обязательно для других контейнеров, аналогичных ассоциативных контейнеров , например, ассоциативный контейнер на основе B-дерева выиграют от разделения ключа и значения в отдельные юридические лица):
std::for_each(_1st, m_map.begin(), m_map.end(), &func);
Мой STL 2.0 page является для параметра [незавершенные] рецензия с немного более подробно о том, как Я думаю, что стандартные алгоритмы библиотеки C++ должны быть улучшены, в том числе разделение итераторов на позиционирование (курсоры) и доступ к свойствам (карты свойств).
Y ou может инициализировать как 'it', так и' end' внутри заголовка цикла, например 'for (iterator it = c.begin(), end = c.end(); ...) ', чтобы немного уменьшить количество« кодов ». Тем не менее, предлагая итераторы, которые вы предлагаете, также заставили бы меня задаться вопросом, предоставляют ли они другой порядок или количество элементов, чем простые итераторы, что, в свою очередь, может сделать код менее ясным. –
Ответ на вопрос «Почему стандартная библиотека C++ не имеет X» почти всегда «они не смогли ее добавить». Чтобы что-то было добавлено в библиотеку, кто-то должен написать для нее предложение, комитет должен обсудить это и одобрить, и этого просто не произошло. Этого не существует, потому что никто не положил его туда. – jalf
Случайные ссылки после быстрого поиска: http://stackoverflow.com/questions/1443793/iterate-keys-in-ac-map, http://stackoverflow.com/questions/7667343/creating-a-stl-map- key-iterator, http://stackoverflow.com/questions/110157/how-to-retrieve-all-keys-or-values-from-a-stdmap, http://stackoverflow.com/questions/259240/iterator- адаптер-to-iterate-just-the-values-in-a-map –