Вразумите, как можно алгоритмом 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 элемент не рассматривается как неизменный ключ?