Effective STL 读书笔记之慎重选择删除容器元素的方法

来源:互联网 发布:ipad软件推荐 知乎 编辑:IT博客网 时间:2019/10/14 18:17

STL容器主要分为顺序容器和关联容器两大类:

1.顺序容器包括:vector、string、deque、list  注意:string没有虚析构函数,不适合做共有继承

2.关联容器包括两大类:

  2.1 有序容器:map、set、multimap、multiset;起重multimap和multiset可允许出现重复关键字的元素

  2.2 无序容器:unordered_map、unordered_set、unordered_multimap和unordered_set,其中unordered_map和unordered_set得头文件是<unordered_map>和<unordered_set>,并且它们也允许出现重复关键字的元素。

//无序容器示例代码如下:
#include "stdafx.h"
#include <iostream>
#include <unordered_map>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 std::unordered_map<int, string> unorderedMapDataTest;
 unorderedMapDataTest.insert(std::pair<int, string>(3, "xiaoping"));
 unorderedMapDataTest.insert(std::make_pair(1, "tiantian"));
 unorderedMapDataTest.insert(std::pair<int, string>(2, "ganggang"));
 return 0;
}

现在返回来说STL容器中某个元素的删除,如果是顺序容器,则写一个循环来遍历容器中的元素,记住每次调用erase时,要使用它的返回值更新迭代器,因为一旦顺序容器erase完成,则返回指向被删除元素的下一个元素的有效迭代器,示意删除代码如下:

 std::vector<int> vectorDataTest(0, 3);
 vectorDataTest.push_back(5);
 vectorDataTest.push_back(6);
 vectorDataTest.push_back(7);
 for (auto iter = vectorDataTest.begin(); iter != vectorDataTest.end(); )
 {
  if (5 == *iter) {
   iter = vectorDataTest.erase(iter);
  } else {
   ++iter;
  }
 }

如果容器是一个标准关联容器的场合,则写一个循环来遍历删除容器中的元素,记住当把迭代器传给erase时,要对迭代器做后缀递增。因为对于标准关联容器,erase的返回类型是void。示意代码如下:

 std::unordered_map<int, string> unorderedMapDataTest;
 unorderedMapDataTest.insert(std::pair<int, string>(3, "xiaoping"));
 unorderedMapDataTest.insert(std::make_pair(1, "tiantian"));
 unorderedMapDataTest.insert(std::pair<int, string>(2, "ganggang"));
 for(auto iter = unorderedMapDataTest.begin(); iter != unorderedMapDataTest.end(); )
 {
  if (0 == strcmp(iter->second.c_str(), "xiaoping")) {
   unorderedMapDataTest.erase(iter++);
  } else {
   ++iter;
  }
 }


0 0