爲什麼對string調用swap會導致迭代器失效

一般來說,swap操作將容器內容交換不會導致容器的指針、引用、迭代器失效。

但當容器類型爲array和string時除外。

原因在於:SSO  (Short String Optimization 指C++針對短字符串的優化。)

  默認情況下,C++的std::string都是存儲在heap中,導致訪問std::string需要經過一次尋址過程,速度較慢,並且這種實現的空間局部性不好,對cache的利用較低。

  很多string的字符串長度很小,這個時候,我們可以把字符串存儲到棧上,從而不需要進行內存分配,優化創建速度,並且訪問棧上數據的局部性很好,速度比較快。

即C++會自動把較短的字符串放到對象內部,較長的字符串放到動態內存。
假如 std::string 用 SSO 實現,而待交換的兩個對象中的字符串恰好一長一短,則原先指向短字符串中的迭代器會全部失效。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章