Во-первых, карты гарантированно стабильны; т.е. итераторы не аннулируются вставкой или удалением элемента (за исключением, конечно, удаляемого элемента).
Однако стабильность итератора не гарантирует стабильность указателей! Хотя обычно случается, что в большинстве реализаций для реализации итераторов используются указатели - по крайней мере, на некотором уровне (что означает, что можно с уверенностью предположить, что ваше решение будет работать), то, что вы действительно должны хранить, - это сам итератор .
Что вы могли бы сделать, это создать небольшой объект, такой как:
struct StringPtrInMap
{
typedef std::map<string,string>::iterator iterator;
StringPtrInMap(iterator i) : it(i) {}
const string& operator*() const { return it->first; }
const string* operator->() const { return &it->first; }
iterator it;
}
А затем сохраните это вместо строкового указателя.