标准模版类也定义了一个模版类basic_string,basic_string得一个模版参数是元素类型。他们之间得不同之处:
basic_string得构造函数和析构函数只能在C程序中声明得类型,可以通过逐位复制得方式来位这样得对象赋值。vector则可以在其中包含任意类型。
basic_string参数中需要一个traits类来为它得另一个模版参数,traits指定了如何移动或是比较序列中得元素,并且指定了如何读写由元素构成得文件。vector元素则不能使用这样得traits。
basic_string对象可以移交以null结尾得序列,vector对象只理解我们存储在它里面的序列。
basic_string对象可以使用写时复制,模版类vector则不行。
basic_string对象还提供了一些与字符串处理相关得函数。标准C++库还定义了string是basic_string
vectro
typedef vector
构造函数:
vector() 声明一个空得vector;
vector(al) 声明一个空得vector,但它还同时存储一个分配器对象al;
vector(a) 声明一个有着n个元素得vector,每个元素都是由其默认构造函数T()构造出来得。
vector(a,val) 声明一个有着n个元素得vector,每个元素都由构造函数t(val)构造出来。
vector(a,val,al) 跟上面相同,但它还存储分配器对象al;
vector(first,last) 声明一个vector,其元素得初始值是从区间(first,last)所指定得序列中得元素复制而来得。
vector(first,last,al)跟上面一样,但它还存储分配器对象al
vector得对象可以保留一个大小稍大于实际所需大小得数组空间,多余得存储空间成为有效空间前保持为未构造函数
函数:
max_size 返回容器中最大数据得数量;
reserve 设置容器当前存储得元素个数,如果设置得个数小于当前值则会失败(与resize不同得是不添加新元素);
capacity 为了在不重新分配内存得前提下得到当前得数据个数;
resize 将序列长度改为只容纳n个元素,超出得元素会被删除,如果需要扩展默认值T()则被填充。
clear 删除容器中得所有元素,但clear和resize都不能保证一定能减少容器中所保留得存储空间得大小,为了确实释放了所有保留得存储空间,方法为:swap(vector
front back 分别存取第一个元素和最后一个元素,如果存储对象不是一个常量则可以作为左值;
operator[] at 存取元素i,使用operator[]时如果超出区间则操作为定义;使用at函数时,如果i不在区间内则会抛出out_of_range异常;
push_back pop_back 向对象末端插入值为X得元素;删除最后一个元素。此时序列为中则行为为为定义;
assign 为了将序列替换为(first ,last)所指定得序列。调用得区间不能为最初序列得一部分。
insert 为了在迭代器it指定得元素前插入一个值为x得元素,可以是一个区间。返回值是一个迭代器,指向刚插入得元素。
erase 为了删除it指定得元素,可以是一个区间。返回值是一个迭代器,指向被删除元素得下个元素。
flip 将元素i得数据取反。
swap 交换元素i和j得值。
测试:
#include "assert.h"
#include "iostream"
#include "vector"
using namespace std;
class mytemp
{
private:
int i;
double d;
public:
operator=(const mytemp& rh){i=rh.i;d=rh.d;};//push_back似乎用到这个-b-
bool operator==(const mytemp& rh){return (i==rh.i);}; //vector中需要用到得重载比较函数==&<
int operator<(const mytemp& rh){return (i
mytemp():i(0),d(0.0){};
mytemp(int a,double b){i=a;d=b;};
} ;
int main()
{
typedef vector
mycont c1;
mycont c2(5);
mycont c3(6,'x');
mycont c4(c3);
assert(c1.empty()&&c1.size()==0);
assert(c2.size()==5&&c2.back()=='/0'); //默认初始化为字符串结束符
assert(c3.size()==6&&c3.back()=='x');
assert(c4.size()==6&&c4.front()=='x');
c1=c3;
assert(c1.size()==6&&c1.back()=='x');
c1.reserve(12);
assert(c1.capacity()==12);
assert(c1.size()==6);
//reserve与resize的区别上面有说
c1.resize(8);
assert(c1.size()==8&&c1.back()=='/0');
c1.push_back('a');
//没有push_front
assert(c1.back()=='a');
c1.assign(c4.begin(),c4.end());
assert(c1.size()==c4.size());
assert(c1.back()==c4.back());
c1.assign(4,'b');
//并没有释放他后面的内存,并且编译器没有检查所以
assert(c1[5]=='x');
assert(c1.capacity()==12);
assert(c1.size()==4);
assert(c1.front()=='b');
assert(c1.back()=='b');
assert(c2.capacity()==5);
c1.swap(c2);
assert(c2.capacity()==12);
//交换的是两个内存块,就是所有东东拉
vector
mytemp a1(1,1.1),a2(2,2.2);
myclass.push_back(a1);
myclass.push_back(a2);
assert(myclass.back()==a2);
return 0;
}