【C++ Primer】顺序容器

来源:互联网 发布:一级域名怎么申请 编辑:程序博客网 时间:2024/05/29 16:47

九、顺序容器


1. 初始化

C<T> c :  适用于所有容器

C<T> c(c2)  :  使用于所有容器,类型必须匹配(容器类型和元素类型都必须相同)

C<T> c(b, e):  b,e是迭代器

C<T> c(n, t) : n个t,只适用于顺序容器

C<T> c(n)    :创建有n个值初始化元素的容器,只适用于顺序容器,若T是类,则必须提供默认构造函数,否则将出错


顺序容器: vector  list  deque

容器内元素的约束:支持赋值运算(引用不可以),对象必须可以复制(IO类型不可以)


容器的容器:vector<vector<string> > lines   // 注意> >之间的空格!但实际上现在很多编译器已经能识别这种错误


2. 迭代器

C<T> c :  适用于所有容器

所有容器迭代器支持的操作:解引用(*与->)、自增减、判断相等与不等


只有vector与deque支持的操作(只有这两种为其元素提供快速随机的访问):加减一个常数(必须保障在容器内或容器末端的下一位置)、>=、 <=


迭代器范围

左闭合区间: [first, last) 从first开始,到last结束,但不包括last,还有r.rbegin()与r.rend()迭代器


容器类型:

size_type、iterator

const_iterator、reverse_iterator

const_reverse_iterator(++操作将变成逆向)、difference_type

value_type   元素类型,

reference      元素的左值类型,等同于value_type&

const_reference   元素常量左值类型,等效于const value_type&,这三者在泛型编程中很有用!


添加操作;

c.push_back()

c.push_front() ,只适用于list与deque

c.insert(p,t)    在迭代器p指向元素之前(防止迭代器位于end位置)插入值为t的新元素,返回指向新添加元素的迭代器

c.insert(p, n, t)  插入n个t,返回void

c.insert(p, b, e) 插入迭代器范围内b/e标记的元素,返回void,可以是数组名与数组名+数组大小,因为迭代器本质是指针

在插入元素时,避免存储end操作返回的迭代器,因为end随着元素的插入会发生改变,应该每次都重新计算end迭代器


关系操作符:容器之间的比较必须两者相同类型,如果容器的元素类型不能进行比较,则比较会出错

==:长度和元素都相等

长度不相同,短的是长的子串,长的大;不是子串,比较第一个元素


容器大小操作:

c.size()

c.empty()  返回布尔值

c.resize(n)  如果原size大于n,则截取;若小于,补足初始化的值

c.resize(n,t)  如果原size大于n,则截取;若小于,补足初始化的值为t  


访问元素:c[]与c.at()只适用于vector与deque

c.front()与c.back()均返回元素的引用

list<int>::reference val = ilist.front() /list<int>::reference val = *ilist.begin() ;


删除元素: 

c.erase(p)   删除迭代器p指向的元素,返回迭代器指向删除元素的后一个元素,一般先使用find函数进行查找:

list<string>::iterator iter = find(slist.begin(). slist.end(), searchValue);

if(iter != slist.end())  slist.erase(iter);

c.erase(b, e)  删除b与e之间的元素,返回迭代器指向删除元素的后一个元素,如果e为end(),则返回c.end()

c.clear()

c.pop_back()   删除最后一个元素,返回void

c.pop_front()  删除第一个元素,返回void,只适用于list或deque


赋值与swap:

c1 = c2  必须类型完全相同

c1.swap(c2) c1与c2交换内容,执行速度比=赋值快,没有移动元素,迭代器不会失效

c.assign(b, e)  重新设置c的元素变为b与e之间的元素,元素类型需要相互兼容

c.assign(n, t)   重新设置为n个t



3. vector容量自增长

vector.capacity()为容量的容量,

vector.reserve(n) 指设定vector的capacity为n,并且在容量变成n之前不需要进行从新设定容量


容器的选择:尽量使用容器通用的操作方式,修改起来比较容易

vector:容器尾部增加删除容易,可以随机访问

list:中间删除增加容易,不能随机访问

deque: 两端增加删除容易,能随机访问



4. string类型

可视作字符容器,但不支持栈方式操作,不能使用first、back和pop_back()、pop_front()操作



构造函数:不支持单个数字的初始化方法

包含指针参数的构造函数:

1.仅包含指针参数,必须以空字符串结尾

2.一个指向字符数组元素,标记要复制多少个字符的计数器,不必要以空字符串结尾

char *cp = "hiya";   // null-terminated

char c_array[] = "world!!!";    // null-terminated

cahr no_null[] = {'H', 'i'};    // non null-terminated

string s4(no_null);   // error

string s5(no_null, 2)   // ok, result is 2


用string子串初始化:

string s(s2, pos2)  从string对象中s2中从下边pos2开始的字符副本

string s(s2, pos2, len2)   从string对象中s2中从下边pos2开始的长为len2的字符副本


修改方法:

除了迭代器操作方法外,还有额外的下标操作方法

insert/assign/erase

substr:

s.substr(pos, n)   从下标pos开始的n个元素

s.substr(pos)       从下标pos开始的元素

s.substr()

append/ replace


查找: 返回值均为string::size_type, 没有找到返回string::npos,区分大小写

s.find(args)  在s中查找args的第一次出现

s.rfind(args) 查找args的最后一次出现

s.find_fisrt_of(args)  查找args中任意字符的第一次出现

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


s.find_fisrt_not_of(args)  查找第一个不属于args的字符

s.find_last_not_of(args)  查找最后一个不属于args的字符

其中args包括:

c, pos    c为字符,pos默认为0

s2, pos  s2为string,pos默认为0

cp, pos  cp为c风格的char指针,pos默认为0

cp, pos, n    cp不一定为c风格指针,pos,n无默认值,在s中从pos开始查找cp的前n个字符


string对象比较:

s.compare()  与strcmp类似,s大返回正数,s小返回负数,相等返回0



5. 容器适配器

类型:

size_type   长度类型

value_type  元素类型

container_type  基础容器的类型


初始化:


A a;   创建新的空适配器

A a(c);  创建初始化容器c的副本的新适配器

stack(先进后出)  :  可建立在list/vector/deque容器之上

s.empty()

s.size()

s.pop()             删除栈顶元素

s.top()               返回栈顶元素

s.push(item)     在栈顶压入


queue(先进先出):  需要push_front()操作,可建立在list容器与deque上,不能建立在vector容器上

priority_queue : 要求随机访问,可建立在vector 和 deque上,不能建立在list上

q.empty()

q.size()

q.pop()

q.front()  只使用于queue

q.back()  只实用于queue

q.top()    只适用于优先级队列

q.push(item)


原创粉丝点击