алгоритмы STL
От: qaz77  
Дата: 22.03.12 17:03
Оценка:
Вразумите, как можно алгоритмом stl выполнить действие над контейнером с модифицирующим доступом к элементам.
Т.е. что-то вроде этого:
void trim(std::string& str);

void foo()
{
  std::vector<std::string> v;
  //...
  for (std::vector<std::string>::iterator it = v.begin(); it != v.end(); ++it)
  {
    trim(*it);
  }
}

Получается ровно реализация std::for_each, но для него запрещена модификация элемента.
Кто-нибудь знает из каких соображений?

std::transform для такой задачи не очень мне нравится, т.к. привносит копирование элемента:
  std::string trim2(const std::string& str);
  
  void bar()
  {
    std::vector<std::string> v;
    //...
    std::transform(v.begin(), v.end(), v.begin(), trim2);
  }


И еще, связанный вопрос про std::set.
Почему оставлена возможность изменить элемент set'а? Это для компаратора по части элемента?
Если в простом примере поменять элемент, то контейнер умирает:
  std::set<std::string> s;
  s.insert("A")
  s.insert("B");

  *s.begin() = "C";
  //... oops

Если бы разыменование итератора возвращало константную ссылку, то такой проблемы бы не возникало.
При этом не константный итератор позволял бы удалять и вставлять элементы.
В общем, как с ключом в std::map.
Т.е. правильно ли я понимаю, что в map элемент явно разделяется на ключ и нагрузку,
а в set элемент не рассматривается как неизменный ключ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.