string和vector将原始保存在连续的内存空间,在尾部插入删除快。
deque支持随机访问,在头尾插入、删除很快。
新版c++增加了forward_list和array,现代c++程序应该使用标准库容器,而不是更原始的数据结构。新版的c++容器要比旧版的快得多。
选择容器的一些原则,除非你有很好的理由选择其他容器,否则使用vector
如果你的程序有很多小元素,且空间的额外开销很重要,则不要使用list或forward_list
如果要去随机访问,赢使用vector或deque
如果在中间插入删除,用list或forward_list
在头尾插入删除,不会在中间,用deque
如果程序只有在读入输入时才需要在容器中间位置插入元素,随后需要随机访问,则,首先,确定是否真的需要在容器中间位置添加元素,通常先在vector追加数据,然后用sort排序。
如果必须在中间位置插入元素,考虑在输入阶段用list,一旦输入完,将list中的内容拷贝到一个vector中。
如果不知道用那种,那么可以在程序中只使用vector和list公共的操作:使用迭代器,不使用下标,避免随机访问。必要时选择vector或list方便。
不是所有的容器都要说明容器的元素信息、
我们不可以为不支持特殊操作需求的类型定义容器,如,vector允许只接受容器大小的参数,有些类没有默认构造函数,如果调用将出错。
容器操作:(关联容器也支持的)
iterator,const_iterator
size_type 无符号整型,足够保存此种容器类型的最大可能的容器大小。
difference_type 带符号整型类型,最够保存两个容器之间的距离。
value_type
reference 元素的左值类型:于value_type&含义相同。
const_reference 元素的const左值类型,即,const value_type&
c c;c c1(c2);
c c(b,e) 将迭代器b和e指定范围元素拷贝到c,array 不支持。
c c 列表初始化
c1= c2
c1 = array不支持。
交换a、b的元素。
swap(a,b)于上边等价。
不支持forward_list
c可保存的最大元素数目。
添加删除元素(不使用于array)
注,在不同容器中,这些操作的接口不同。
使用inits构造c中的一个元素。
删除args指定的元素。
反向容器的额外成员(forward_list不支持)
reverse_iterator
const_reverse_iterator
auto it7 = 仅当a是const是,it7才是const_iterator
auto it8 = it8 是const_iterator
array构造函数不能接收大小参数,如果元素类型是内置类型或有默认构造函数的类可以只提供以个容器大小的参数,如果类么有默认构造函数,就必须显示的指定元素的初始值。
当将一个容器初始化为另一个容器时,两个容器必须类型一致。
array具有固定大小:array
assign操作部使用于关联容器和array,只有顺序容器可用,可以实现不同容器见的赋值。
将seq中的元素替换成迭代器b、e所表示的范围中的元素。b、e不能指向自身。
将seq中的元素替换为初始化列表中的元素。
将seq中的元素替换为n个值为t的元素。
swap 不会导致指向容器的迭代器,引用和指针失效(array和string除外)
数组下标类型size_t,在头文件cstddef中。
初array外,swap不对任何元素进行拷贝,删除或插入操作,因此可以保证常数时间内完成。
非成员版本的swap在泛型编程中重要,统一使用非成员比较好。
向顺序容器添加元素:
这些操作会改变容器大小,array 不支持。
forward_list 有自己专有的insert和emplace
forward_list不支持push_back和emplace_back
vector和string不支持push_front和emplace_front
在c的尾部创建一个值为t或由args创建的元素。返回void
在c的头部创建一个值为t或args创建的元素,放回void
在p之前创建一个值为t或由args创建的元素,返回指向新添加元素的迭代器。
在迭代器p指向的元素之前插入n个值为t的元素。返回指向新添加第一个元素的迭代器,若n为0,返回p
将迭代器b和e指定的范围内元素插入p之前,b,e不是c中元素,返回第一个元素的迭代器,范围为空,返回p
il是一个元素列表,将这些值插入迭代器p之前,返回第一个元素的指针,若为空返回p
向一个vector,string或deque插入元素会使所有指向容器的迭代器,引用,指针失效。
在vector、string尾部外任何位置,或deque外任何位置添加元素都要移动元素,而且向vector、string添加元素可能引起整个对象存储空间的重新分陪。
用一个对象插入和初始化时,实际放入的是对象的拷贝,就像将对象传给非引用参数。
push 和 insert 是将对象传给他们,而emplace是去调用类的构造函数,参数和构造函数的参数一样。
at和下标操纵符适用于,string,vector,deque,array 提供快速访问。
当使用数组作为auto变量的初始值时,推断得到的类型是指针而不是数组。
但是当使用decltype时上述转化不会发生,放回的是数组。
下标运算符返回的是元素的引用。
如果担心下标越界,可使用at ,如果越界at会抛出一个out_of_rang异常。
顺序容器的删除:操作会改变容器大小,不适用于array
forward_list 有特殊版本的erase,forward_list 不支持pop_back;vector和string不支持pop_front
删除之前必须确保元素是存在的。
删除c中尾元素。c若为空,则函数行为未定义返回void
删除迭代器p所指定的元素,返回一个指向被删除元素之后元素的迭代器,若p指向尾元素,则返回尾后迭代器,p是尾后迭代器,则未定。
删除b和e范围内的元素。返回最好一个被删除元素之后的迭代器,若e本身是尾后迭代器,则也返回尾后迭代器。
删除所有元素,返回void
删除deque中除首尾元素的任何元素都会使所有迭代器、引用和指针失效。指向vector和string中删除点之后位置的迭代器、引用和指针都会失效
forward_list中特殊的操作:
返回指向链表首元素之前不存在的元素的迭代器。此迭代器不能解引用。cbefore_begin()返回一个const_iterator
/在迭代器之后位置插入元素。t是一个对象,n是数量,b和e是一对范围迭代器(不能指到lst内),il是一个花括号列表,返回一个指向最后一个元素的迭代器。如果范围空,则返回p。
若p为尾后迭代器,则函数行为未定义。
emplace_after(p,args); 使用args在p指定的位置之后创建一个元素,返回指向这个新元素的迭代器。若p为尾后迭代器,则未定义。
/删除p指向的位置之后的元素,或删除从b之后直到e之前的元素。返回一个指向被删除元素之后元素的迭代器,若不存在,则返回尾后迭代器,如果p指向lst的尾元素或是一个尾后迭代器,则未定义。
改变容器大小,resize不适用于array
调整c的大小为n个元素。若n 调整c的大小为n个元素,任何新添加元素都初始化成t
如果resize缩小容器,则指向被删除元素的迭代器。引用和指针都会失效。对vector、string或deque进行resize可能导致迭代器、指针和引用失效。
在向容器添加元素后:
如果容器是vector或string,且存储空间被重新分配,则指向容器的迭代器、指针和引用会失效。如果存储空间未重新分配,指向插入位置之前的元素的迭代器、指针和引用仍有效。但指向插入位置之后元素的迭代器。
指针。引用将会失效。
对于deque,插入到除首尾位置之外的任何位置都会导致迭代器、指针和引用失效。如果在首尾位置添加元素,迭代器会失效,但指向存在的元素的引用和指针不会失效。
C11学习笔记 5
参数传递时,如果是引用类型,它将绑定到对应的实参上,否者,将实参的值拷贝后赋给形参。引用可避免拷贝,如果不需要改变参数,最好定义成常量引用。和其他初始化一样,当用实参初始化时会忽略顶层const,当形参有顶层const时,传给它常量对象或非常量对象都可以。我们可以用非常量初始化一个底层const对象...
C 11学习笔记 11
动态分配的内存,只有在显式释放是,这些对象才会销毁。但是标准库中的两智能指针可以确保自动释放。除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。静态内存用来保存局部static对象 类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数没得非stat...
C 11学习笔记 16
tuple是类型pair的模板。不同tuple类型的成员类型也不同,但一个tuple可以有任意数量的成员。每个确定的tuple类型的成员数目是固定的。当我们希望将一些数据组合成单一对象,但有不想麻烦地定义一个新数据结构来表示时,tuple是非常有用的。快速而随意 的数据结构 tuple类型及其伴随类...