C++学习笔记之容器:顺序容器

来源:互联网 发布:网络维护maxingit 编辑:程序博客网 时间:2024/05/20 05:11

顺序容器包括:string, vector,deque,list,forward_list, array.每个容器除了支持公共的操作接口,还有自己的操作。比如单向链表的迭代器不能自减运算.


string : 保存字符或字符串,随机访问,尾部插入或删除.

vector:可变大小数组,随机访问,尾部插入或删除.

array:固定大小数组,随机访问,不能添加或删除元素.

deque: 双端队列,随机访问,头尾插入或删除元素快.

list:双向链表,双向顺序访问,任何位置可以插入和删除.

forward_list: 单向链表,单向顺序访问,任何位置插入和删除.


1. 容器的定义和初始化

方法:

C c      默认构造函数

C c1(c2) 将一个容器初始化为另一个容器的拷贝

C c={a,v,b,...}  列表初始化

C c(b,e)   利用迭代器的范围,将迭代器范围的元素赋给

只有顺序容器的构造函数还可以接受容器大小和一个元素初始值的参数

C c(n,value)/c(n)

对于array:定义一个array时需要指定数据类型,还要指定容器大小。如果元素为类类型,那么类必须有默认构造函数。

                         array<数据类型,容器大小对象名;

PS:不能对内置数组类型进行拷贝或对象赋值操作,因为内置数组和array是不同的。

 

2.赋值

方式:拷贝,列表赋值,swap,assign

拷贝:c1=c2;

列表赋值: c1={a,d,....};

assign:

v.assign(b,e):俩个迭代器之间的元素

v.assign(lt):lt为值列表

v.assign(n,t):用n个t来给容器V赋值

 

swap:

v1.swap(v2):交换容器 v1,v2的数据

swap(v1,v2):

对于array:不能使用assign,以及不允许值列表对其赋值,但是可以列表初始化。

使用assign仅顺序容器能用,不适合array和关联容器。

 

2.添加元素:

array不能添加和删除元素

push_back(emplace_back): vector,string,deque,list

push_front(emplace_front): deque,list, forward_list

empalce(iterator,value)

empalce(iterator,args)  返回指向插入的第一个元素的迭代器

insert(iterator,value)

insert(iterator,n,value)

insert(iterator,b,e)

insert(iterator,list) 返回新添加的第一个元素的迭代器,不成功返回iterator


3.删除元素

pop_back : vector,string,deque,list

pop_front: deque,list,forward_list

erase(iterator)

erase(b,e)

clear()


4.访问元素:

包括array在内的顺序容器有front的成员函数,除了forward_list外都有 back 成员函数,通过调用他们可以获得首尾元素的引用。(访问元素前确保容器非空),使用下标不能越界。

下标和at只能用在可以随机访问的容器中:string,vector,deque,array.


5.改变容器大小

通过成员函数resize()可以调整容器元素的数量。

resize(n):如果n值大于当前的容器元素个数,那么增加新元素到容器尾部。如果n值小于容器元素个数,那么容器后面元素被删除
resize(n,value): 增加的新元素到容器尾部,新元素值为value


6.管理容器容量:

capacity():不重新分配内存的话,容器保存多少元素

shrink_to_fit():将capacity()减少为size()相同大小,但是这只是个请求,标准库不一定退还内存

reserve(n):分配能至少容纳n个元素的内存,调用reserve不会减少内存,只会大于或等于当前容量。

shrink_to_fit():只适合string,vector,deque。

capacity()和reserve()只适合string,vector。

7.forward_list的特殊操作:

尽管forward_list有特殊版本的操作,但也支持前面的通用操作。

单向链表定义了首前迭代器:before_begin().

插入元素:

insert_after(iterator,value);在iterator指向的元素后插入元素值为value的元素

insert_after(iterator,n,value);

insert_after(iterator,b,e);删除迭代器b,e之间的元素

insert_after(iterator,list);插入值列表,返回指向插入最后一个元素的迭代器

emplace_after(p,value);

emplace_after(p,args);

删除元素:

erase_after(iterator);删除iterator指向元素的后一个位置的元素

erase_afer(b,e);删除迭代器b,e之间的元素,返回指向被删元素后的元素的迭代器


8.string的相关整理

<1>IO流对string的操作:

istringstream: 从string中读数据

ostringstreamstring写数据

 

<2>.构造string的其他方法:

string s(cp,s):string类型s是cp指向的数组前n个字符的拷贝。

string s(s2,pos): s是string的s2从下标pos开始的字符拷贝,如果pos>s2.size(),那么构造函数未定义

string s(s2,pos,n): s是string s2从下标pos开始的n个字符的拷贝。

当我们利用字符数组构造string时候,必须使数组以空字符结尾,因为拷贝操作遇到空字符为止。否则造成构造函数未定义。


<3>.string其他操作

 

substr :返回string ,是原string的部分或全部字符的拷贝。传递给substr一个起始位置和计数值。

s.substr(pos,n):返回从pos位置开始后的n个字符

 

s.erase(pos,len) 删除从pos(pos可以是位置或迭代器)指向的字符开始的n个字符。如果n忽略,则删除从pos开始到末尾的所有字符。

s.insert(pos,args) 在pos之前插入args指定的字符

s.assign(args) 将s中字符全部换成args指定的字符

s.append(args)  将args指定的字符追加到s中

s.replace(range,args) 将range范围内的字符替换成将args指定的字符、

 

args形式:

(str): 字符串str

(str,pos,len):str中pos开始最多len个字符 

(cp)      指向以空字符结尾的数组

(cp,len) 字符数组前len个字符

(n,c)    n个字符c

(b,e )    迭代器B,E之间的字符

初始化列表: {.........}

range形式: (pos, len)或(b,e)


<4>.string的搜索

操作:

s.find(args):查找s中args指向字符第一次出现的位置

s.rfind(args) :查找s中args指向字符最后一次出现的位置

s.find_first_of(args) : 查找s中args中任一字符第一次出现的位置

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

s.find_first_not_of(args) : 查找s中第一个不在args出现字符的位置

s.find_last_not_of(args) : 查找s中最后一个不在args出现字符的位置

 

args形式: str 字符串

           c,pos   从s中位置pos开始查找字符c

           s2,pos   从s中位置pos开始查找字符串s2

           cp,pos  从pos开始查找以空字符结尾的字符串

           cp,pos,n  从pos开始查找数组前n个字符

<5>.比较

compare 和C语言的 strcmp 类似

 

s.compare(s1) 比较s和s1

s.compare(pos1,n1,s2) 将s中从pos1开始的n1个字符与 s1比较

s.compare(pos1,n1,s2,pos2,n2) 将s中从pos1开始的n1个字符与 s1的pos2开始的n2个字符比较

s.compare(cp) s和cp指向的以空字符结尾的数组比较

s.compare(pos,n,cp) 将s中从pos开始的n个字符与 cp指向的以空字符结尾的数组比较

s.compare(posncpn1)  s中从pos开始的n个字符与 cp指向的以空字符结尾的数组前n1个字符比较

 

<6>.数组转换

将数组转换成字符,将数值字符转换成数值

to_string(val)  将数值转换成字符型,val可为任何算术类型

stoi作用:      string转换成int 

stoi(s,p.b)  s:字符串  p:保存字符串内第一个非数组字符的下标,默认为0  b:转换用的基数,默认为10

stod stofatol 等都相似


PS:有些操作不进行过多的注释,因为本文的主要目的是将顺序容器梳理下,以便以后复习之用!


0 0
原创粉丝点击