C++基本知识点(二)

1.迭代器实效的情况

迭代器失效分三种情况考虑,也是分三种数据结构考虑,分别为数组型,链表型,树型数据结构。

  • 数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就是说insert(*iter)(或erase(*iter)),然后在iter++,是没有意义的。解决方法:erase(*iter)的返回值是下一个有效迭代器的值。 iter =cont.erase(iter);

  • 链表型数据结构:对于list型的数据结构,使用了不连续分配的内存,删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器.解决办法两种,erase(*iter)会返回下一个有效迭代器的值,或者erase(iter++).

  • 树形数据结构: 使用红黑树来存储数据,插入不会使得任何迭代器失效;删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器.erase迭代器只是被删元素的迭代器失效,但是返回值为void,所以要采用erase(iter++)的方式删除迭代器。

注意:经过erase(iter)之后的迭代器完全失效,该迭代器iter不能参与任何运算,包括iter++,*ite。ataMap.erase(iter++);这句话分三步走,先把iter传值到erase里面,然后iter自增,然后执行erase,所以iter在失效前已经自增了。

2.红黑树

为了解决排序二叉树插入新节点后,树不平衡的问题
红黑树要满足的条件:

  • 1.节点是红色或黑色。

  • 2.根节点是黑色。

  • 3.每个叶子节点都是黑色的空节点(NIL节点)。

  • 4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

  • 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

在这里插入图片描述
红黑树最长路径不会超过最短路径的两倍
插入新节点的时候(最好是红色的,这样能够保证路径上黑色节点数量保持不变, 因此如果本身插入的根节点是红色,就需要做出相应的调整),如果不满足红黑树的这些限制,就必须进行调整:

  • 变色
    • 变色的话如果是要红变黑,主要同一级节点上均要做到红变黑,才能保证从左子树下和从右子树下来路径上黑色节点的数目是一致的。
  • 旋转
    左旋转:
    在这里插入图片描述
    右旋转:
    在这里插入图片描述

3.lower_bound(),upper_bound()

lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。

  • 在从小到大的排序数组中:
    lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
    upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  • 在从大到小的排序数组中,重载lower_bound()和upper_bound()
    lower_bound( begin,end,num,greater< type>() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
    upper_bound( begin,end,num,greater< type>() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

4.Vector回收空间

(1) clear()
使用clear()成员函数,清空元素,但不回收空间

vecInt.clear();
int capacity = vecInt.capacity();   //512
int size = vecInt.size();           //0

(2) erase()
使用erase()成员函数,但需要使用迭代器逐个删除,注意:erase()自动返回下一个元素的迭代器。

for (auto iter = vecInt.begin(); iter != vecInt.end(); ){
    iter = vecInt.erase(iter);
}
int capacity = vecInt.capacity();   //512
int size = vecInt.size();           //0

(3) swap()
使用swap()成员函数,清除元素并回收内存

vector<int>().swap(vecInt);     //清除容器并最小化其容量
int capacity = vecInt.capacity();   //0
int size = vecInt.size();           //0

猜你喜欢

转载自blog.csdn.net/huanghaihui_123/article/details/88048730