1、關(guān)于vector中元素的刪除和迭代器失效問(wèn)題
view plaincopy to clipboardprint?
vector<int> vv;
vv.push_back(1); //加入第一個(gè)元素
vector<int>::iterator itBegin = vv.begin(); //獲取第一個(gè)元素迭代器*itBegin=1
vv.push_back(2); //因?yàn)轭A(yù)留不夠,所以發(fā)生內(nèi)存搬移,之前迭代器將全部失效
vv.push_back(1); //即是說(shuō)itBegin現(xiàn)在已經(jīng)是個(gè)無(wú)效迭代器
vv.push_back(1); //所以使用vector迭代器一定要小心失效!
vv.push_back(3); //移動(dòng)、增加、插入、刪除以及reserve、resize都可能使迭代器無(wú)效!
vv.push_back(4);
vv.push_back(3);
vv.push_back(5);
vv.push_back(6);
int n = vv.size(); //n = 9
vector<int>::iterator itrmv = remove(vv.begin(), vv.end(), 3); //結(jié)果:1,2,1,1,4,5,6,5,6
n = vv.size(); //n = 9
//刪除vector中等于某值的所有元素
//remove算法只是對(duì)容器中有效元素向前移動(dòng)覆蓋無(wú)效元素,返回第一個(gè)無(wú)效元素指針
//1、它不會(huì)有刪除動(dòng)作 2、尾部無(wú)效元素沒(méi)有意義 3、之后容器size不變
vv.erase(itrmv, vv.end()); //結(jié)果:1,2,1,1,4,5,6
n = vv.size(); //n = 7
bool BeDelete(int n)
{
return n == 1 || n == 2;
}
//借助remove_if算法刪除vecotr中符合某些條件的所有元素
vv.erase(remove_if(vv.begin(), vv.end(), BeDelete), vv.end()); //結(jié)果:4,5,6
n = vv.size(); //n = 3
//若用循環(huán)實(shí)現(xiàn)刪除,需要注意erase后迭代器失效問(wèn)題
for(vector<int>::iterator it=vv.begin(); it!=vv.end(); )
{
if(*it == 4)
{
/*錯(cuò)誤的做法
vv.erase(it); //對(duì)vector進(jìn)行增加刪除等操作后之前it可能無(wú)效
it++; //it此時(shí)已經(jīng)無(wú)效
*/
/*錯(cuò)誤的做法
vv.erase(it++); //erase后元素發(fā)生了移動(dòng)所以it多向后跳過(guò)一個(gè)元素
*/
it = vv.erase(it); //正確的做法,erase返回下一個(gè)有效it
}
else
{
it++;
}
}
n = vv.size(); //n=2,結(jié)果:5,6
vector<int> vv;
vv.push_back(1); //加入第一個(gè)元素
vector<int>::iterator itBegin = vv.begin(); //獲取第一個(gè)元素迭代器*itBegin=1
vv.push_back(2); //因?yàn)轭A(yù)留不夠,所以發(fā)生內(nèi)存搬移,之前迭代器將全部失效
vv.push_back(1); //即是說(shuō)itBegin現(xiàn)在已經(jīng)是個(gè)無(wú)效迭代器
vv.push_back(1); //所以使用vector迭代器一定要小心失效!
vv.push_back(3); //移動(dòng)、增加、插入、刪除以及reserve、resize都可能使迭代器無(wú)效!
vv.push_back(4);
vv.push_back(3);
vv.push_back(5);
vv.push_back(6);
int n = vv.size(); //n = 9
vector<int>::iterator itrmv = remove(vv.begin(), vv.end(), 3); //結(jié)果:1,2,1,1,4,5,6,5,6
n = vv.size(); //n = 9
//刪除vector中等于某值的所有元素
//remove算法只是對(duì)容器中有效元素向前移動(dòng)覆蓋無(wú)效元素,返回第一個(gè)無(wú)效元素指針
//1、它不會(huì)有刪除動(dòng)作 2、尾部無(wú)效元素沒(méi)有意義 3、之后容器size不變
vv.erase(itrmv, vv.end()); //結(jié)果:1,2,1,1,4,5,6
n = vv.size(); //n = 7
bool BeDelete(int n)
{
return n == 1 || n == 2;
}
//借助remove_if算法刪除vecotr中符合某些條件的所有元素
vv.erase(remove_if(vv.begin(), vv.end(), BeDelete), vv.end()); //結(jié)果:4,5,6
n = vv.size(); //n = 3
//若用循環(huán)實(shí)現(xiàn)刪除,需要注意erase后迭代器失效問(wèn)題
for(vector<int>::iterator it=vv.begin(); it!=vv.end(); )
{
if(*it == 4)
{
/*錯(cuò)誤的做法
vv.erase(it); //對(duì)vector進(jìn)行增加刪除等操作后之前it可能無(wú)效
it++; //it此時(shí)已經(jīng)無(wú)效
*/
/*錯(cuò)誤的做法
vv.erase(it++); //erase后元素發(fā)生了移動(dòng)所以it多向后跳過(guò)一個(gè)元素
*/
it = vv.erase(it); //正確的做法,erase返回下一個(gè)有效it
}
else
{
it++;
}
}
n = vv.size(); //n=2,結(jié)果:5,6
2、釋放vector容器多余的內(nèi)存
view plaincopy to clipboardprint?
vector<int> vn;
vn.reserve(10); //預(yù)留10個(gè)元素空間
int nn = vn.capacity(); //nn = 10
vn.push_back(1);
vn.push_back(2);
nn = vn.capacity(); //nn = 10
vector<int>(vn).swap(vn); //通過(guò)建立一個(gè)新對(duì)象釋放多余空間
nn = vn.capacity(); //nn = 2
nn = vn.size(); //nn = 2
vector<int>().swap(vn); //會(huì)完全清空容器,釋放所有空間
vector<int> vn;
vn.reserve(10); //預(yù)留10個(gè)元素空間
int nn = vn.capacity(); //nn = 10
vn.push_back(1);
vn.push_back(2);
nn = vn.capacity(); //nn = 10
vector<int>(vn).swap(vn); //通過(guò)建立一個(gè)新對(duì)象釋放多余空間
nn = vn.capacity(); //nn = 2
nn = vn.size(); //nn = 2
vector<int>().swap(vn); //會(huì)完全清空容器,釋放所有空間
3、map中刪除滿足某些條件的元素
view plaincopy to clipboardprint?
map<int, int> mm;
mm.insert(make_pair(1,1));
mm.insert(make_pair(2,2));
mm.insert(make_pair(3,1));
mm.insert(make_pair(4,3));
mm.insert(make_pair(5,3));
mm.insert(make_pair(6,6));
//注意:對(duì)map和set等自動(dòng)排序的容器不應(yīng)使用remove一類(lèi)算法
//應(yīng)使用for+erase或者while+find_if+erase
//第一種方法for+erase
map<int, int>::iterator mit;
for(mit = mm.begin(); mit != mm.end();)
{
if(mit->second == 1)
{
mm.erase(mit++); //這里需要注意
}
else
{
mit++;
}
}
//第二種方法,while+find_if+erase
//僅以元素做條件檢索
bool mBeDelete(const pair<int, int>& val)
{
return val.second == 1;
}
mit = find_if(mm.begin(), mm.end(), mBeDelete);
while(mit != mm.end())
{
mit = find_if(mm.erase(mit), mm.end(), mBeDelete);
}
//除元素外還需要傳入另外一個(gè)條件參數(shù)
//這里的參數(shù)無(wú)法使用常量引用
bool mBeDelete2(pair<int, int> val, int n)
{
return val.second == n;
}
mit = find_if(mm.begin(), mm.end(), bind2nd(ptr_fun(mBeDelete2),3));
while(mit != mm.end())
{
mit = find_if(mm.erase(mit), mm.end(), bind2nd(ptr_fun(mBeDelete2),3));