STL List和Deque在删除元素时的区别

来源:互联网 发布:淘宝smastudio是谁的店 编辑:程序博客网 时间:2024/06/05 21:34

在STL容器的操作中,往往需要遍历删除某些元素,本文将给出如何遍历删除元素的快速方法。同时说明List和Deque删除元素的区别。

至于List和Deque,甚至Vector的区别,读者自行去了解,网上很多解释。这里只说明迭代器的区别,让大家快速正确的使用STL容器。

List在Erase后,迭代器仍然可以使用;Deque在Erase后,队列结果发生了变化,迭代器将与之不兼容,执行会报错。STL容器删除元素后,会返回一个迭代器,此迭代器指向当前删除元素的后继元素或是end(),可以通过此方法解决deque的遍历删除报错问题。上代码:

#include "stdafx.h"#include <string>#include <iostream>#include <list>#include <deque>using namespace std;int _tmain(int argc, _TCHAR* argv[]){    // 1.list的遍历删除,正确运行    list<string> list;    list.push_back("H");    list.push_back("E");    list.push_back("?");    list.push_back("L");    list.push_back("L");    list.push_back("?");    list.push_back("?");    list.push_back("O");    list.push_back("?");    list.push_back("?");    std::list<string>::iterator listIter = list.begin();    for (; listIter != list.end();)    {        if ("?" != *listIter)        {            ++listIter;        }        else        {            list.erase(listIter++);        }    }    for (listIter = list.begin(); listIter != list.end(); ++listIter)    {        std::cout << " " << *listIter << " ";    }    //// 2.deque的遍历删除,将报错    //std::deque<string> deque;    //deque.push_back("H");    //deque.push_back("E");    //deque.push_back("?");    //deque.push_back("L");    //deque.push_back("L");    //deque.push_back("?");    //deque.push_back("?");    //deque.push_back("O");    //deque.push_back("?");    //deque.push_back("?");    //std::deque<string>::iterator dequeIter = deque.begin();    //for (; dequeIter != deque.end();)    //{    //  if ("?" != *dequeIter)    //  {    //      ++dequeIter;    //  }    //  else    //  {    //      deque.erase(dequeIter++);    //  }    //}    //for (dequeIter = deque.begin(); dequeIter != deque.end(); ++dequeIter)    //{    //  std::cout << " " << *dequeIter << " ";    //}    // 3.deque的遍历删除,正确运行    std::deque<string> deque;    deque.push_back("H");    deque.push_back("E");    deque.push_back("?");    deque.push_back("L");    deque.push_back("L");    deque.push_back("?");    deque.push_back("?");    deque.push_back("O");    deque.push_back("?");    deque.push_back("?");    std::deque<string>::iterator dequeIter = deque.begin();    for (; dequeIter != deque.end();)    {        if ("?" != *dequeIter)        {            ++dequeIter;        }        else        {            dequeIter = deque.erase(dequeIter);        }    }    for (dequeIter = deque.begin(); dequeIter != deque.end(); ++dequeIter)    {        std::cout << " " << *dequeIter << " ";    }    system("pause");    return 0;}