Нет, вы не можете (или, по крайней мере, не должны) изменять ключ, пока он находится в наборе. Это может изменить относительный порядок элементов, и в этом случае изменение приведет к тому, что набор окажется недействительным.
Вам необходимо начать с набора вещей, которые вы можете изменить. Затем вам нужно найти элемент, удалить его из набора, изменить его, а затем снова вставить результат обратно в набор.
std::set<std::string> myset {"catt", "world", "hello"};
auto pos = std::find_if(myset.begin(), myset.end(), [](auto const &s) { return s.find("tt");};
if (pos != myset.end()) {
auto temp = *pos;
myset.remove(pos);
auto p= temp.find("tt");
temp.replace(p, 2, "t");
myset.insert(temp);
}
Для ассоциативных контейнеров вы не должны использовать указатель в качестве ключа, так как тогда это будет *** указатель ***, который является ключом, а не данными, на которые он указывает. Если вы хотите, чтобы ключ был строкой, вы должны использовать 'std :: string'. –