对string调用swap函数,为什么迭代器会失效

#include
#include
#include
using namespace std;

int main()
{
string s1("string");
string s2("test");
vectorvec1{1,2};
vectorvec2{2,3,4,5};

vector<int>::iterator i1 =vec2.begin();
vector<int>::iterator i2 = i1 +2;//vec1.begin();

string ::iterator i3= s1.begin();
string ::iterator i4= i3+3;

cout<<&s1<<endl;
cout<<&s2<<endl;

cout<<&s1[0]<<"  "
    <<&s2[0]<<endl;

swap(s1,s2);

swap(vec1,vec2);
cout<< *i3<<" "<<*i4<<endl;
for(auto c : s1)
{
    cout<<c;
}
cout<<endl;
    for(auto c : s2)
{
    cout<<c;
}
cout<<endl;
cout<<*i1<<endl;
cout<<*i2<<endl;

cout<<&s1;


return 0;

}

vector的是内存与元素值一起改变。
但string的是为什么???
看不出哪里失效。