STL容器使用常見問題整理

2021-09-25 01:34:17 字數 1697 閱讀 2784

1、vector的刪除

//初始化

vectorvectest;

vectest.push_back(100);

vectest.push_back(200);

vectest.push_back(300);

vectest.push_back(400);

//刪除

vector::iterator itor;

for (itor = vectest.begin(); itor != vectest.end(); )

//驗證

for (itor = vectest.begin(); itor != vectest.end(); itor++)

2、map的插入

我們知道map的插入有兩種方式:一種是insert,還有一種是下標訪問插入;

insert操作時,如果key存在,則會插入失敗,如果key不存在,就會建立這個key--value。

下標訪問插入時,如果這個key存在,則更新其value,如果key不存在,則就建立這個key--value鍵值對。

mapmapint;

mapint.insert(pair(1, 1));

mapint.insert(pair(2, 2));

mapint.insert(pair(3, 3));

//插入成功

mapint[1] = 5;

//插入失敗

mapint.insert(pair(1,5));

在專案中,經常會盲目的使用insert進行插入,導致不能達到預期的目的。

3、string不能賦null值;unordermap不會根據key值排序,insert進去的是無序的(隨機亂序的),若想按插入的順序儲存直接用pair。

4、含有stl容器的結構體初始化誤用memset

一、動態可變更儲存長度的類都是使用指標,附加動態申請記憶體實現的。而動態申請的記憶體本身並不包含在物件的本身大小上面,在物件中儲存乙個指標,它能夠找到動態申請的記憶體的位址。所以,你不管動態申請多少記憶體,它物件中的乙個指標總能找得到你,它指標的大小不會發生改變。也就是說,它所在的結構體變數的大小也是不會改變的!

動態申請的記憶體不包含在物件的本身大小上,它所在結構體變數的大小是不會改變的

二、向量是使用名稱為「_myproxy」、「_mynextiter」這兩個指標來尋找與之相鄰的值的,在我們定義乙個向量時,它便初始化乙個「_myproxy」,而我的**卻在類的建構函式中對定義的結構體執行了乙個清零的操作:

zeromemory(&m_stcstruct, sizeof(struct));從而導致了向量中的「_myproxy」丟失,雖然仍可以對其進行push_back()等其他幾乎一切操作,但是這個向量缺唯獨不能執行遍歷者一種操作!!

迭代器報「vector iterators incompatible」錯

三、為了實現多型機制,c++對有虛函式的物件會包含乙個指向虛函式表(v-table)的指標,當使用memset時,會把該虛函式表的指標也初始化為0,而dynamic_cast也使用rtti技術,執行時會使用到v-table,可此時由於與v-table的鏈結已經被破壞,導致程式發生異常。

正確使用memset

四、每次memset,把string維護的指標弄沒了。所以找不到之前的資料了,就導致記憶體洩露

string 作為結構體成員變數之記憶體洩露

STL常見問題

vector vector中 reserve 函式 預先分配一塊較大的指定大小的記憶體空間,其中n為分配空間的大小 預留一定的空間,如果n capacity 並不會減少空間 void reserve size type n resize 函式 會改變元素的數目,不改變記憶體空間的大小 void re...

STL容器使用DEMO vector

code author lin yiqian created 2009 08 24 describe stl vector 使用demo include include using namespace std typedef vector int vec 列印vector void printvec...

STL容器使用DEMO multimap

code author lin yiqian created 2009 08 24 describe stl multimap 使用demo include include include using namespace std typedef multimap str mmap 列印multima...