C++ STL vector和map使用注意事項

STL Vector

1紫岩、vectorclear 函數(shù)和 erase 函數(shù)并不會對內(nèi)存進行回收规惰,會導(dǎo)致內(nèi)存泄漏。需要回收內(nèi)存泉蝌,最簡單的方法是使用 swap 函數(shù)和臨時變量交換歇万。

#include <iostream>
#include <vector>
#include <windows.h>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")

int ShowMemoryInfo(void) {
    HANDLE handle = GetCurrentProcess();
    PROCESS_MEMORY_COUNTERS pmc;
    GetProcessMemoryInfo(handle, &pmc, sizeof(pmc));
    return pmc.WorkingSetSize / 1000;
}

int main(int argc, char *argv[]) {

    std::vector<int> v;

    std::cout << "start memory: " << ShowMemoryInfo() << "KB" << std::endl;
    for (int i = 0; i < 10000000; i++) {
        v.push_back(i);
    }
    std::cout << "after push:   " << ShowMemoryInfo() << "KB" << ",size=" << v.size() << ",capacity=" << v.capacity() << std::endl;

    v.clear();
    std::cout << "after clear:  " << ShowMemoryInfo() << "KB" << ",size=" << v.size() << ",capacity=" << v.capacity() << std::endl;

    {
        std::vector<int> tmp;
        tmp.swap(v);
    }
    std::cout << "after swap:   " << ShowMemoryInfo() << "KB" << ",size=" << v.size() << ",capacity=" << v.capacity() << std::endl;

    return 0;
}

output:
start memory: 4100KB
after push:   52506KB,size=10000000,capacity=11958657
after clear:  52514KB,size=0,capacity=11958657
after swap:   4579KB,size=0,capacity=0

2、因為 vector 使用一個數(shù)組作為它的底層存儲勋陪,移除向量除尾端以外位置的元素贪磺,會導(dǎo)致容器在操作之后將所有元素重新定位到它們的新位置。與其他類型的序列容器(如list或forward_list)相比诅愚,vector 的 erase 通常是一個低效的操作缘挽。

循環(huán)刪除vector/set/map中元素

  • 正確方法1:
std::vector<int> v;
int del = 1;
for (auto it = v.begin(); it != v.end(); ) {
    if (*it == del) {
        it = v.erase(it);   // erase函數(shù)返回刪除元素后面的一個元素的迭代器
    } else {
        it++;
    }
}
  • 正確方法2:
std::vector<int> v;
int del = 1;
for (auto it = v.begin(); it != v.end(); ) {
    if (*it == del) {
        v.erase(it++);
    } else {
        it++;
    }
}

1、通過erase方法的返回值來獲取下一個元素的位置
2呻粹、在調(diào)用erase方法之前先使用 “++”來獲取下一個元素的位置

  • 錯誤方法
std::vector<int> v;
int del = 1;
for (auto it = v.begin(); it != v.end(); it++) {
    if (*it == del) {
        v.erase(it);
    }
}

在調(diào)用erase方法之后使用“++”來獲取下一個元素的位置壕曼,由于在調(diào)用erase方法以后,該元素的位置已經(jīng)被刪除等浊,如果在根據(jù)這個舊的位置來獲取下一個位置腮郊,則會出現(xiàn)異常。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筹燕,一起剝皮案震驚了整個濱河市轧飞,隨后出現(xiàn)的幾起案子衅鹿,更是在濱河造成了極大的恐慌,老刑警劉巖过咬,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件大渤,死亡現(xiàn)場離奇詭異,居然都是意外死亡掸绞,警方通過查閱死者的電腦和手機泵三,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衔掸,“玉大人烫幕,你說我怎么就攤上這事〕ㄓ常” “怎么了较曼?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長振愿。 經(jīng)常有香客問我捷犹,道長,這世上最難降的妖魔是什么冕末? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任伏恐,我火速辦了婚禮,結(jié)果婚禮上栓霜,老公的妹妹穿的比我還像新娘翠桦。我一直安慰自己,他們只是感情好胳蛮,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布销凑。 她就那樣靜靜地躺著,像睡著了一般仅炊。 火紅的嫁衣襯著肌膚如雪斗幼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天抚垄,我揣著相機與錄音蜕窿,去河邊找鬼。 笑死呆馁,一個胖子當(dāng)著我的面吹牛桐经,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浙滤,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼阴挣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纺腊?” 一聲冷哼從身側(cè)響起畔咧,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤茎芭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后誓沸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梅桩,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年拜隧,在試婚紗的時候發(fā)現(xiàn)自己被綠了宿百。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡虹蓄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幸撕,到底是詐尸還是另有隱情薇组,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布坐儿,位于F島的核電站律胀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏貌矿。R本人自食惡果不足惜炭菌,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逛漫。 院中可真熱鬧黑低,春花似錦、人聲如沸酌毡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枷踏。三九已至菩暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旭蠕,已是汗流浹背停团。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掏熬,地道東北人佑稠。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像旗芬,于是被迫代替她去往敵國和親讶坯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容