"C++ Primer" 读书笔记 第九章 顺序容器

  • vector<char> a(10,'a'); 这种初始化方式只能用于顺序容器
  • 迭代器(指针)可以用于初始化一段元素的副本。特别的,如果是用其他容器初始化,则要求容器类型和元素类型必须相同,但是用迭代器初始化则不需要容器类型相同,且元素类型也只需要可以转换即可。
char * words[] = {"hello","world","!"}; // words是一个数组,元素为char*
vector<string> a(words,words+2); // 通过指针(迭代器)对容器进行赋值
vector<string> b(words,words+4); // error,最多只能指向超出末端的下一位置
  • 容器内的元素必须支持赋值(IO标准库对象和引用类型就不行了)和复制操作(IO标准库对象就不行了)
  • 使用迭代器时注意迭代器失效的坑,例如erase()方法或者insert()方法
  • 容器迭代器也支持 解引用、自增/自减、==判断,!=判断。特别地,顺序容器的迭代器还支持

    iter+n, iter1+iter2, iter2-iter1, >, >=, <, <=这样的运算

  • insert操作可以用于将一个vector的所有元素放到另一个vector之后:

  v1.insert(v1.end(), v2.begin(), v2.end()); // 将所有迭代器范围内的元素插入到v1.end()之前

  • 容器间可以用关系运算符来比较大小:==  >  < 等(元素类型必须支持关系运算符)
  • 顺序容器可以方便地调整容器的长度大小, v.resize(n)或v.resize(n,t)即可(当然可能会使迭代器失效)
  • 对顺序容器作下标/front()/back()运算,一定小心越界错误
  • 删除元素:
    • v.erase(p); // 删除之后指向被删除元素后面的元素
    • v.erase(b,e); // 删除迭代器范围内的元素
    • c.clear();
  • 容器的赋值操作开销挺大的:必须将左操作数容器中所有元素删除,然后将右操作数容器的所有元素插入到左操作数中(实际上是通过erase()和insert()方法实现的)
  • swap()操作,可以常数时间地将两个容器的内容交换。且原来的迭代器仍然有效。要求容器和元素类型必须相同。
  • assign(it1,it2)操作,先删除容器中所有的元素,然后将迭代器范围内所有元素赋值给容器。好处是这里不要求容器类型相同,元素类型也只需要兼容即可。 
  • size()是容器内实际有的元素个数,capacity()是容器内可以存储元素的最大数量,reserve()方法可以给容器手动分配空间。
  • 如何根据我们的需求选用合适的容器呢?

     一般无脑用vector容器!

   如果有随机存取的要求,则在vector和deque中选择;

     如果不是在容器的中间位置,而是在头部或者尾部插入/删除元素,用deque;

   如果需要频繁地在中间位置插入/删除元素,用list

 

  string类型也可以看作是vector容器,要了解string支持什么特性:

  • 构造方法:用迭代器、字符数组、另一个string子串初始化string对象
  • 修改的方法:(与容器相同的)用迭代器和迭代器范围进行insert、erase、assign操作;(string特有的)用下标指示insert和earse的位置
  • append函数用于在字符串末尾插入,replace则是替换
  • s.find()/s.rfind()查找第一次出现/最后一次出现的位置
  • s.find_first_of(s1)查找s1中任意字符的第一次出现
  • s.find_first_not_of(s1)查找第一个不属于s1中字符的位置

  容器适配器

  queue, priority_queue, stack并不是容器,而是容器适配器,它们可以通过不同的基础容器实现。默认的stack和queue都用deque容器实现,而priority_queue则用vector实现。注意stack可用所有顺序容器实现;queue不能用vector,因为没有push_front()操作;priority_queue要求能够随机存取,因此不能用list实现。

  stack和queue是我们熟悉的栈和队列。

  priority_queue的所有方法与queue相同。可以在初始化时指定排序策略。push()向堆中插入一个元素,pop()向堆中弹出顶部元素,top()返回堆顶的元素。(堆顶的元素是按某种规则最大/最小的元素)

posted @ 2019-07-08 18:13  LiaoQian1996  阅读(63)  评论(0)    收藏  举报