cpp vector容器遍历、查找与清空、删除指定元素

⌚Time: 2023-03-15 12:54:02

👨‍💻Author: Jack Ge

使用迭代器遍历容器


vector<struct SM> vec;

...

vector<struct SM>::iterator iter;

for(iter = vec.begin(); iter != vec.end(); iter++){

    cout<<iter->id<<end;

}

for循环遍历容器


for(int i=0; i<vec.size(); i++){

    cout<<vec.at(i).id<<end;

}

查找容器元素特定是否存在


int findID = 3;

vector<struct SM>::iterator iter;

for(iter = vec.begin(); iter != vec.end(); iter++){

    if(iter->id == findID){

        break;

    }

}

if(iter == vec.end()){

    cout<<"元素不存在"<<endl;

}else{

    cout<<"元素存在"<<endl;

}

清空容器


vector<struct SM>().swap(vec);

或者


vec.swap(vector<struct SM>());

删除特定元素

使用erase删除迭代器指向的指定元素后,迭代器会失效,通常以下写法会导致程序崩溃


string qs = "aa";

vector<struct SM>::iterator iter;

    for(iter = v->begin();iter!=v->end();iter++){

        if(!iter->name.compare(qs)){

            v->erase(iter);//iter 失效,下次循环会崩溃

        }

    }

}

正确写法


string qs = "aa";

vector<struct SM>::iterator iter;

for(iter = v->begin();iter!=v->end();){

    if(!iter->name.compare(qs)){

        iter = v->erase(iter);//使用erase返回的迭代器重新赋值iter

    }else{

        iter++;

    }

}

或者


    char *pstr = "jone";

    for (int i = 0; i < vuser->size(); i++){

        if (!strcmp(vuser->at(i).name, pstr)){

            vuser->erase(vuser->begin() + i);

            i--;//自动右移一位,防止漏掉一个元素

        }

    }