一般來說,swap操作將容器內容交換不會導致容器的指針、引用、迭代器失效。
但當容器類型為array和string時除外。
原因在於:SSO (Short String Optimization 指C++針對短字符串的優化。)
默認情況下,C++的std::string都是存儲在heap中,導致訪問std::string需要經過一次尋址過程,速度較慢,並且這種實現的空間局部性不好,對cache的利用較低。
很多string的字符串長度很小,這個時候,我們可以把字符串存儲到棧上,從而不需要進行內存分配,優化創建速度,並且訪問棧上數據的局部性很好,速度比較快。
即C++會自動把較短的字符串放到對象內部,較長的字符串放到動態內存。
假如 std::string 用 SSO 實現,而待交換的兩個對象中的字符串恰好一長一短,則原先指向短字符串中的迭代器會全部失效。