容器
c.begin() c.end()
:指向容器第一个元素和紧跟在最后一个元素之后的那个位置的迭代器
c.rbegin() c.rend()
:对于允许以逆序访问其元素的容器,表示的是指向容器最后一个元素和位于第一个元素之前的那个位置的选代器。
container<i> c;
container<T> c(c2);
: 定义一个容器c
。如果给定c2
,那么c
是c2
的一个复件;否则c
为空。
contanier<T> c(n);
:定义一个有n
个元素的容器c
,c
根据T
的类型而被数值初始化。如果T
是一个类类型,那么这个类型将控制元素的初始化方式。如果T
是一个内部算术类型,那么元素将被初始化成0
。
contanier<T> c(n,t);
:定义一个有n
个元素的容器c
,c
的元素是t
的复件:
contanier<T> c(b,e);
:创建一个容器,这个容器保存了位于区间[b,e)
中的迭代器所指示元素的一个复件。
c=c2;
:用容器c2
的一个复件来替换容器c
的内容。
c.size()
:返回c
的元素个数,返回值的类型是 size_type
。
c.empty()
:一个判定,被用来指示c
是否没有元素。
c.insert(d,b,e)
:复制由位于区间[b,e)
中的迭代器所指示的元素,并且把它们插入到c
中位于d
之前的位置中。
c.erase(it) c.erase(b,e)
:从容器c
中删除由it
指示或由[b,e)
指示的元素。对于list
,这个操作是快速的;但对于vector
和string
则可能比较慢。
c.push back(t)
:在c
的末尾添加一个元素,这个元素的值是t
。
- 支持随机访问的容器和
string
类型同时也提供了如下的操作:
c[n]
:从容器c
中取出位于位置n
的字符。
迭代器
一个迭代器(iterator
)是一个值,它能够
- 识别一个容器以及一个容器中的一个元素
- 让我们检查存储在这个元素中的值
- 提供操作来移动在容器中的元素
- 采用对应于容器所能够有效处理的方式来对可用的操作进行约束
迭代器的行为与索引相似,用迭代器来代替索引。
迭代器类型
每一个标准容器,都定义了两种相关的迭代器类型:
container-type::const_iterator
container-type::iterator
container-type
是容器的类型,包括容器元素的类型。
用迭代器来修改存储在容器中的值,使用iterator
类型;仅需要读操作,使用const_iterator
类型。
可以把一个iterator
类型的对象转换为const_iterator
类型,但反过来不行。
container<T>::sizetype
:类型名称,保存这个容器可能存在的最大实例的长度。
迭代器的操作
定义一个迭代器之后,将值设为begin
:begin
和end
函数返回一个值,指示一个容器的开头或指示紧接着在容器最后一个元素后面的那个位置。
begin
返回一个类型为container-type::iterator
的迭代器,指向容器的第一个元素。end
返回一个类型为container-type::iterator
的迭代器,指向容器最后一个元素后面的第一个位置。- 循环中存在删除操作,则不变式使用
size()
而非end()
。
== !=
比较两个迭代器(不管其类型有无const
)是否相等。
++iterator iterator++
增量运算符,为迭代器类型重载,把迭代器推进到容器的下一个元素。
*iterator
间接引用运算符,访问元素,用于迭代器返回一个迭代器指向元素的左值。
*
的优先级比.
低,与++
和--
相同,使用(*iterator).name
获取类对象的一个成员iterator->name
与上述等价,优先级与.
相同。
+
:iterator.begin() + i
迭代器和索引的类型决定表达式中+
的意义。
若容器不支持随机访问索引的操作,那么无法定义+
的类型,将禁止对它的元素的随机访问,仍会允许迭代器的顺序访问。
erase()
:删除迭代器指向元素的值,返回一个迭代器,指向紧跟在删除掉的元素后面的元素。
- 要将结果重新赋值给迭代器
list
类型
- 定义于头文件
<list>
中,可以在容器中的任何位置快速插入和删除元素。- 顺序访问容器,
list
的速度比vector
慢。 - 容器主要是尾部增长或缩小的话,
vector
的性能比list
好。 - 容器删除很多元素或大规模输入,
list
速度更快。 vector
的操作大多可以转化成对list
的,但是list
不支持索引。
- 顺序访问容器,
list
与vector
的重要差别
对迭代器进行某些操作产生的影响彼此不同
vector
删除一个元素,指向被删除元素或随后的元素的迭代器都会失效;使用push_back
给vector
添加一个元素会使指向vector
的迭代器失效。list
,erase
和push_back
操作不会使指向其他元素的迭代器失效,只有指向已被删除的元素的迭代器才会失效。
list
类不支持完全随机访问,不能使用标准库中的sort
函数对list
中的值进行排序,list
类提供自己的sort
成员函数。
l.sort l.sort(cmp)
使用适用于list
元素类型的<
运算符来排列l
中的元素,或使用判定cmp
来排列元素。
从容器中删除元素,选择list
;
小规模输入,list
效率要比vector
低;
大规模输入,不适当使用的vector
程序运行起来比使用list
慢得多。
string
字符串
特殊的容器,仅包含字符,支持某些容器操作(索引);string
类型提供了迭代器,与vector
迭代器类似。
s.substr(i,j)
:创建一个新的字符串保存s
在区间[i,i+j)
中的索引所指示的字符的一个复件。
getline(is, s)
:定义于<string>
,读输入直到行尾,第一个参数是输入流(istream
),从这个流读数据;第二个参数是一个字符串引用,将读到的数据存储在这个字符串引用中。
<cctype>
头文件为处理字符数据而提供了有用的函数:
isspace(c)
如果c是一个空白字符则结果为true(真)。
isalpha(c)
如果c是一个字母字符则结果为true(真)。
isdigit(c)
如果c是一个数字字符则结果为true(真)。
isalnum(c)
如果c是一个字母或数字则结果为true(真)。
ispunct(c)
如果c是一个标点字符则结果为true(真).
isupper(c)
如果c是一个大写字母则结果为true(真)。
islower(c)
如果c是一个小写字母则结果为true(真)。
toupper(c)
产生一个等于c的大写字母。
tolower(c)
产生一个等于c的小写字母。