STL之vector容器(补充)

来源:互联网 发布:牙签弩淘宝暗语 编辑:程序博客网 时间:2024/04/28 10:02

标准模版类也定义了一个模版类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<char,char_traits<char>>得同义词。

 


 

vectro<bool> 模版类vector得特化版本,处理元素类型为bool得序列,可以更加经济得使用内存,将8个元素存储在一个相同得字节空间内,并定义了特殊得flip和swap处理函数;

 


 

typedef vector<T,allocalor<T>> mycont; 通过使用默认得模版参数,可以省略第二个参数

构造函数:

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<T,A>());

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<rh.i);};
 //这几个重载函数真正决定了这个自定义类能不能正常工作
 mytemp():i(0),d(0.0){};
 mytemp(int a,double b){i=a;d=b;};
 } ;

int main()
{
 typedef vector<char> mycont;
 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> myclass;
 mytemp a1(1,1.1),a2(2,2.2);
 myclass.push_back(a1);
 myclass.push_back(a2);
 assert(myclass.back()==a2);
 return 0;
 
}