Итераторы
std::vector
могут быть недействительными при изменении его содержимого. См. аннулирование векторного итератора .
Если вы действительно хотите сохранить существующий интерфейс и сохранить указатели от элементов, вставленных в ваш вектор, вы можете хранить строки по указателям, а не по значению, например:
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class store2
{
public:
store2 ()
{
}
~store2 ()
{
for (std::vector<std::string *>::iterator it =
words.begin (), end_it = words.end ();
it != end_it; ++it)
{
delete *it;
}
words.clear ();
}
void add (const std::string & s)
{
std::auto_ptr<std::string> v (new std::string (s));
words.push_back (v.get ());
v.release ();
}
std::string *last_added ()
{
return words.back ();
}
const std::string *last_added () const
{
return words.back ();
}
private:
std::vector<std::string *> words;
};
int main ()
{
store2 store;
store.add("one");
std::string* s1 = store.last_added();
std::cout<<*s1<<std::endl;
store.add("two");
std::cout<<*s1<<std::endl; // no crash :-)
}
Существует также класс ptr_vector
в Boost, который нацелен на то, чтобы сделать это решение более пригодным для повторного использования и надежным (т.е. автоматически управляет памятью, поэтому вам не нужно беспокоиться об удалении строки при удалении ее указатель из вектора и т. д.).