為什麼對string呼叫swap會導致迭代器失效

2022-08-30 18:00:15 字數 432 閱讀 7175

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

但當容器型別為array和string時除外。

原因在於:sso  (short string optimization 指c++針對短字串的優化。)

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

很多string的字串長度很小,這個時候,我們可以把字串儲存到棧上,從而不需要進行記憶體分配,優化建立速度,並且訪問棧上資料的區域性性很好,速度比較快。

即c++會自動把較短的字串放到物件內部,較長的字串放到動態記憶體。

假如 std::string 用 sso 實現,而待交換的兩個物件中的字串恰好一長一短,則原先指向短字串中的迭代器會全部失效。

String為什麼是final

1.可以快取 hash 值 因為 string 的 hash 值經常被使用,例如 string 用做 hashmap 的 key。不可變的特性可以使得 hash 值也不可變,因此只需要進行一次計算。2.string pool 的需要 如果乙個 string 物件已經被建立過了,那麼就會從 strin...

String為什麼是Final的?

1 final的用途 string是被final修飾的類,其屬性value 是被final修飾的。所以string是不可被繼承的,value被儲存的資料不可更改性 引用位址不可更改,陣列本身可變 但是value是private修飾的,而且string是不可被繼承的,所以保證了字串不可變性 那麼為什麼...

為什麼string是引用型別

在c 中分為值型別和引用型別,值型別為int float bool char struct等簡單資料型別,引用型別有stirng,class。然而string的身為引用型別卻表現得與值型別十分相同。為什麼string為引用型別呢?首先明白string指向常量空間的位址。如果我們有乙個字串 strin...