STL Vector
1紫岩、vector
的 clear
函數(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)異常。