C/C++基础----顺序容器

通常没有特别的原因,用vector。

list和forward_list有额外的内存开销,如果有很多小元素,不要使用。

如果只在读取输入时需要在容器中间位置插入元素,随后需要随机访问。

  1确定是否真正需要在中间位置插入,可以用vector再用sort排序;

  2如必须在中间插入元素,可在输入阶段用list,完了之后拷贝到vector

insert与emplace(emplace_back、emplace_front)

emplace是直接将参数传递给元素类型的构造函数,在容器管理的内存空间中直接构造元素。

与insert相比,省去了构造临时对象,减少了内存开销。

类型别名在泛型编程中很有用。

直接容器拷贝,要求容器类型和元素类型都匹配;

用迭代器拷贝不要求,只要元素类型可以转换即可。

array,跟内置数组一样,大小也是类型的一部分。

跟其他容器不同,默认构造的array的元素都是默认初始化,跟数组一样。

但是array支持拷贝和赋值操作,不过容器类型和大小,元素类型都必须相同。

不允许将花括号列表赋值给array。

assign允许从一个不同但相容的类型赋值

assign操作不适用与array和关联容器。

swap操作不会对任何元素进行拷贝删除或插入(除array外),可以在常数时间内完成。

除string外指向容器的迭代器,指针和引用在swap之后都不会失效。仍指向swap操作之前的元素,但是已属于不同容器了。

对于array,swap会真正交换元素,所需时间与元素数目成正比。但是迭代器指针等也不会失效。

非成员版本swap在泛型编程中很重要。

只有当元素也定义了相应的比较运算符的时候,才可以使用比较运算符来比较两个容器。

向vector、string、deque插入元素(除首尾),都需要移动元素,甚至可能引起对象存储空间的重新分配。用迭代器范围插入时,迭代器不能指向本容器。

访问元素

在调用front或者back(解引用begin --end)之前,确保非空。

c.front() c.baock() c[n] 都有越界风险 c.at(n)则会抛出out_of_range异常。

forward_list特殊操作

因为单向链表没有简单的办法来获取其前驱,所以是通过操作给定元素后面的元素来完成的。insert_after、emplace_after、erase_after。

还特意定义了首前迭代器lst.before_begin()  lst.cbefore_begin()

一般insert/emplace返回第一个添加的元素的迭代器,而after版本指向最后一个插入元素的迭代器。

迭代器失效

添加元素

vector、string:存储空间重新分配,则全部失效;未重新分配,则插入之前部分的迭代器、引用指针仍有效。

deque:首尾以外的位置,全部失效。首尾添加,迭代器会失效,引用指针不会。

list、forward:仍有效。

删除元素

list、forward:仍有效。

deque:首尾以外的位置,全部失效。删除尾元素,尾后迭代器失效;删除首元素,仍有效

vector、string:被删之前的部分仍有效。

当使用迭代器(指针、引用),最小化要求迭代器必须有效的程序片段。在循环中更新迭代器。

尾后迭代器总是会失效,不要保存

容量大小

shrink_to_fit()  将分配的空间减小到与size()相同大小,仅适用于vector、string、deque

capacity()   不重新分配内存,可以保存多少元素,仅vector和string

reserve()   分配至少能容纳n个元素的内存空间,仅vector和string

resize()是改变容器中元素的数目,不会减少容器预留的内存空间

 

string额外操作

构造

如果从一个数组构造string,必须以空字符结尾,否则需要指定拷贝前n个字符。

string s(cp, n);;

string s(s1, pos,len),pos超出s1的size会报异常,len不管多大最多拷贝至string结尾。

string除了迭代器版本,还支持下标的操作

insert、erase、append、replace、assign

搜索函数

返回string::size_type无符号类型

将返回值用int来保存不是个好主意。

find(args)                          //查找s中args第一次出现的位置

rfind(args)倒查                  //查找s中args最后一次出现的位置

find_first_of(args)       //s中查找args任意一个字符第一次出现的位置

find_last_of(args)        //s中查找args任意一个字符最后一次出现的位置

find_first_not_of(args)    //s中查找第一个不在args中的字符

find_last_not_of(args)     //s中查找最后一个不在args中的字符

args中可以指定开始查找的位置pos,默认为0。这个可以方便连续查找。

数值类型转换

to_string(val)

stoi(s, p, b)

stol(s, p, b)

stoul(s, p, b)

stoll(s, p, b)

stoull(s, p, b)

stof(s, p, b)

stod(s, p, b)

stold(s, p, b)

p是size_t的指针,用来存放第一个非数值字符的下标,默认为0

b是转换的基数,默认为10

容器适配器

适配器是一种机制,能使某种事物的行为看起来像另外一种事物。容器、迭代器、函数都有适配器。通用操作empty、size、swap

默认情况下,stack和queue是基于deque,priority_queue是基于vector实现。

stack:只要求push_back pop_back back,除了array和forward_list都可以

queue: 要求back、push_back、front、pop_front,可以构造与list或deque之上

priority_queue:除了front、push_back、pop_back的操作还要求随机访问,可以构造于vector或deque。

stack栈操作

s.pop()

s.push(item)

s.emplace(args)

s.top()

queue和priority_queue操作

q.pop()  返回queue首元素或者prio的最高优先级元素

q.front() q.back()  返回首元素或者尾元素,不删除,只适用于queue

q.top()   返回最高优先级元素,但不删除

q.push(item)   在queue末尾或者prio中恰当位置创建一个元素或者由args构造一个元素

q.emplace(args)

前缀中缀后缀表达式

http://blog.csdn.net/yuyanggo/article/details/48063473

原文地址:https://www.cnblogs.com/logchen/p/9576364.html