1.容器的自增长:
我们知道vector容器元素是连续存储的,当添加一个元素时,如果容器中已经没有空间容纳新的元素,这时候由于容器元素必须连续存储以便随机访问,所以vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素,即存放在旧的存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。而对于不连续存储元素的容器而言,就不存在内存分配问题。例如list容器。
为了解决这个问题,能够使vector容器实现快速的内存分配。实际上分配的容量要比当前所需要的空间多一些。vector容器预留了这些额外的内存容量的确切数目因库不同而不同。
对此vector容器提供了两个成员函数来实现以上的功能:capacity和reserve。capacity是获取载入热熔器需要分配更多的存储空间之前能够存储的元素总数,reserve告诉vector容器应该预留多少个元素的存储空间。在这里要注意size()和capacity()之间的区别:size()指容器当前拥有的元素个数,capacity()指容器在必须分配新的存储空间之前可以存储的元素总数。
2.再谈string类型:
string除了自身的操作外,也支持大多数顺序容器操作。在某些方面,可以将string类型视为字符容器。如string类型可以提供vector容器相同的操作,不同的是string类型没有front,back,pop_back操作。string可以使用迭代器begin,end,下标操作,删除erase和clear等等。
(1)构造string对象的其他方法:通过迭代器方式来构造:string s(s.begin(),s.end());指针方式:string s(cp,n);
相同对象s1的复制:string s(s1,pos);和string s(s1,pos,len);
(2)修改string的其他方法:
与容器一样,string提供了插入和删除以及重新分配操作:
与容器相同的是:基于迭代器的插入和删除以及重新分配操作:(p,b,e分别指的都是迭代器,如果有返回值的都是返回迭代器)
s.insert(p,t) ; s.insert(p,n,t) ;s.insert(p,b,e) ;s.assign(b,e); s.assign(n,t) ; s.erase(p) ;s.erase(b,e);
与容器不相同的是:采用下标操作来插入和删除以及重新分配操作。(pos表示的下标为pos的元素的位置)
s.insert(pos,n,c) ;s.insert(pos,s2) ;s.insert(pos,s2,pos2,len) ;s.insert(pos,cp,lend) ;s.insert(pos,cp) ;s.assign(s2) ;s.assign(s2,pos2,len) ;s.assign(cp,len) ;s.assign(cp) ;s.erase(pos,len) ;
(3)只适合于string类型的操作:
string类型提供了容器不支持的其他的几种操作:1.substr函数 和2.append和replace函数用于string对象的修改3.find函数,用于查找string对象。
s.substr(pos,n)返回一个string类型的字符串,它包含s中从下标pos开始的n个字符
s.substr(pos)返回一个string类型的字符串,它包含从下标pos开始到s末尾的所有字符
s.substr();返回s的副本
s.append(args)将s串接在s后面,返回s的引用
s.replace(pos,len,args)删除s中从下标pos开始的len个字符,用args指定的字符替换,返回s的引用。
s.replace(b,e,args)删除迭代器b和e标记的范围内所有的字符。用args替换。返回s的引用。
args可以为:s2 ; s2,pos2,len2 ; cp; cp,len; n,c; b2,e2;
(4)string类型的查找操作:在string类型find等一系列的查找操作中,返回的都是string::size_type 类型的值。
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的字符。返回第一个不属于args字符的出现的位置。
s.find_last_not_of(args)在s中查找最后一个不属于args的字符。返回最后一个不属于args字符的出现的位置。
args可以为:c,pos;在s中从下标pos开始查找字符c。s2,pos;在s中从下标pos开始查找字符串s2。
cp,pos;在s中从下标pos开始查找指针cp指向的C风格的以空字符结束的字符串。cp,pos,n;在s中从下标pos开始查找指针cp所指向数组的前n个字符。
(5)string类型的比较对象:
s.compare(s2)比较s和s2 。s.compare(pos1,n1,s2)让s中从pos1下标位置开始的n1个字符与s2做比较。
s.compare(pos1,n1,s2,pos2,s2)让s中从pos1下标位置开始的n1个字符与s2从pos2下标位置开始的n2个字符做比较。
s.compare(cp)比较s和cp所指向的以空字符结束的字符串做比较
s.compare(pos1,n1,cp)让s中从pos1下标位置开始的n1个字符和cp所指向的以空字符结束的字符串做比较。
s.compare(pos1,n1,cp,n2)让s中从pos1下标位置开始的n1个字符和cp所指向的字符串前n2个字符做比较。
3.容器适配器:
标准库还提供了三种顺序容器适配器:queue、priority_queue和stack。容器适配器可以让已存在的容器类型采用另一种不同的抽象类型的工作方式实现。如stack适配器可以为任何一种顺序容器一栈的形式工作。