中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
vector、map容器刪除操作總結(jié)
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));  
 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
vector執(zhí)行erase后迭代器的位置
C++中Vector的erase(詳細(xì)解釋?zhuān)﹦h除操作
erase和remove
Vector 變量的使用
STL remove和erase
C STL之vector
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服