C
C
C
C
C
顺序容器: vector list deque
容器内元素的约束:支持赋值运算(引用不可以),对象必须可以复制(IO类型不可以)
容器的容器:vector
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
删除元素:
c.erase(p) 删除迭代器p指向的元素,返回迭代器指向删除元素的后一个元素,一般先使用find函数进行查找:
list
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
vector.capacity()为容量的容量,
vector.reserve(n) 指设定vector的capacity为n,并且在容量变成n之前不需要进行从新设定容量
容器的选择:尽量使用容器通用的操作方式,修改起来比较容易
vector:容器尾部增加删除容易,可以随机访问
list:中间删除增加容易,不能随机访问
deque: 两端增加删除容易,能随机访问
可视作字符容器,但不支持栈方式操作,不能使用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
类型:
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)