C++ primer 学习笔记(七)

charpter 9 顺序容器

本章内容为第三章的拓展内容。顺序容器类型提供了快速顺序访问元素的能力。

顺序容器概述

  • 基本容器 vector/deque/list/forward_list/array/string
    • vector,string 将元素保存在持续的内存空间。可以快速访问元素。但是在容器中间添加或删除元素会非常费时。
    • list和forward_list可以在任何位置添加或删除元素,但不支持随机访问,额外开销大
    • array 规定长度的数组
  • 反向容器 reverse_iterator c,c.rbegin(),c.rend()//逆序迭代

    容器常用

  • 迭代器范围 [begin,end)
  • 拷贝指定范围内的元素 vector data(data2.begin(),data2.end())
  • array用法:array<type,size>与普通数组的差别:普通数组不支持拷贝,array支持拷贝,数组类型匹配即可。不支持{}赋值。
  • 容器的拷贝与赋值:
    • 赋值=。容器类型必须相同。赋值运算后,两容器大小相等,均为右侧容器大小,亦可通过{}赋值,除了array
    • swap(c1,c2)交换元素。容器类型必须相同,速度较拷贝快
    • 替换操作 c.assign(begin,end)//c.assign(il)//c.assign(n,t)//类型匹配即可(const* 与string亦可)
  • 容器的大小操作:(1)容器的大小size();(2)容器的最大容纳元素数max_size();(3)容器是否为空empty();

    顺序容器操作

  • push_front 在容器首添加元素(list,deque)
  • insert 在容器任意部位插入元素(vector,deque,list,string),

    用法:
    (1)seq.insert(iterator,xx)插到迭代器位置之前。缺点耗时
    (2)seq.insert(iterator,n,xx)插108个
    (3)seq.insert(iteratot,{xx,xx,xx,xx})
    insert返回值为指向当前位置的迭代器

  • 访问元素 front/bach首尾元素 value = a.front();//必须保证非空
  • 删除元素 (array不满足该操作)
    • c.pop_back()、c.pop_front()(vector,string 不支持破pop_front和push_front)
    • c.clear()
    • c.erase(p)// 删除迭代器指定元素。返回删除后位置迭代器。
    • c.erase(b,e)//删除迭代器b和e所制定范围内的元素。返回最后一个删除元素之后元素位置迭代器 、
  • 改变容器元素的个数(array不支持该操作)c.resize(size),若大小大于当前大小,则增加至容器尾部,若小于,则删除后部位容器元素。
  • *添加/删除vector、string、deque元素将导致迭代器失效。.erase(),.insert()操作可以更新迭代器,因为其返回值为更新后位置迭代器。
  • *不要保存end返回的迭代器。end = c.end() 不建议
  • 容器的容量.capacity()指在不分配新的内存空间的前提下,他最多可以保存多少元素;.reserve(n),分配n大小的内存空间

    额外的strng操作

  • 除了一般顺序容器构造方式,string还支持其他三个构造
    • string s(s2,index) // 从s2下标index开始拷贝
    • string s(s2,index,len) // 从s2下标index开始拷贝,长度为len
    • string s(cp,n) // 拷贝cp指向数组的前n个字符
  • 注意,用静态数组构造string时,必须保证以’\0’结尾,或者指定个数,类似于string s(a,10)
  • substr 操作 返回原始string的一部分拷贝,s1.substr(0,5) //s1.substr(6)指从6到最后
  • string 除了接受迭代器的insert和erase,还接受下标版本。即insert(index,n,xx)
  • .append() 在尾部添加,.replace(range,arg),删除range范围内的字符,替换为arg
    范围可用(index,n)或者迭代器(begin,end)
  • string的搜索操作
    • s.find(s1) 返回值为string::size_type 型,即为无符号类型。第一次出现s1的下标。若无,则显示很大值 =string::npos
    • s.refind(s1) 最后一次出现s1的下标
    • s.find(s1,pose),从pose出开始查找
  • string的比较 类似于c里的strcmp,s.compare(arg)返回0,正,负
    • arg 参数可以为s2、(pos1,n1,s2)(pos1,n1,s2,pos2,n2)