如碼:
#include <iostream>
#include <vector>//随機通路 末尾插入删除----std::vector
#include <list> //雙向清單
#include <deque>//雙端隊列 随機通路
#include <string>
#include <algorithm>//算法定義頭檔案
#include <numeric> //求和函數存在的頭檔案
using namespace std;
class Person
{
public:
Person();
Person(char *name)
{
this->name=name;
}
void showName()
{
cout<<"name ="<<name<<endl;
}
private:
char *name;
};
void TestVector()
{
double data[]={1.2,3.4,5.5,4.2,6.4,7.8};
vector<int> v1(100,-1);//初始化第一種,1參放數量,2參放初始化參量
v1[2]=42;//随機通路 可直接修改元素
v1.push_back(22);//在末尾添加元素
vector<double> v2(data,data+4);//将數組元素初始化成矢量
vector<double> v3(v2.begin(),v2.end()-1);//從别的矢量進行初始化
cout<<"v1: size="<<v1.size()<<" capacity="<<v1.capacity()<<" v1[100]="<<v1[100]<<endl;
cout<<"v2: size="<<v2.size()<<" capacity="<<v2.capacity()<<" v2[1]= "<<v2[1]<<endl;
cout<<"v3: size="<<v3.size()<<" capacity="<<v3.capacity()<<" v3[1]= "<<v3[1]<<endl;
/*
begin() end() 兩個疊代器 rbegin() rend()兩個逆向疊代器 end指向的是最後一個元素的下一個位置
*/
auto len=v1.capacity();//獲得容器目前的容量的容量
auto size=v1.size();//獲得容器的大小
if(v2.empty())//判斷是否為空
cout<<"this vector is empty!"<<endl;
//最大容量
vector<string> strings;
cout<<"the max size of the vector is "<<strings.max_size()<<endl;
//改變大小
vector<int> v4(5,66);
v4.resize(6,88);//66 66 66 66 66 88
v4.resize(7);//66 66 66 66 66 88 0
v4.resize(4);//66 66 66 66
//通路元素--超過界限會抛出out_of_range異常
cout<<" v1[1]= "<<v1.at(1)<<endl;
//通路最前和最後一個元素
int last=v1.back();
cout<<" v1 first = "<<v1.front()<<" last ="<<v1.back()<<endl;
last=0;
cout<<" change last ="<<v1.back()<<endl;
cout<<"添加一個元素 201"<<endl;
v1.push_back(201);
cout<<" v1 last = "<<v1.back()<<endl;
//這種方式得來的元素不能修改
const int& firstNumber=v1.front();
const int& lastNumber=v1.back();
//删除末尾元素-----clear()清空所有元素
v1.pop_back();
cout<<" 删除元素後 last ="<<v1.back()<<endl;
//insert(index,number(可有可無,插入多少個相同元素),element)可在制定位置插入元素
//erase()可删除指定位置的元素(start,end)可删除區間内元素
vector<int> v5(3,66);
vector<int> v6(4,77);
cout<<"v5 : ";
for(int i=0;i<v5.size();i++)
cout<<v5.at(i)<<" ";
cout<<endl;
cout<<"v6 : ";
for(int i=0;i<v6.size();i++)
cout<<v6.at(i)<<" ";
cout<<endl;
//交換後
v5.swap(v6);
cout<<"v5 : ";
for(int i=0;i<v5.size();i++)
cout<<v5.at(i)<<" ";
cout<<endl;
cout<<"v6 : ";
for(int i=0;i<v6.size();i++)
cout<<v6.at(i)<<" ";
cout<<endl;
//assign(vector.start,vector.end)可換成vector中的區間内元素
//vector不僅可以包含所有基本資料類型還能包含類類型
//疊代器周遊
vector<Person> v7;
Person p1("zhangsan");
Person p2("lisi");
v7.push_back(p1);
v7.push_back(p2);
auto iter=v7.begin();
while(iter!=v7.end())
iter++->showName();
}
void dequeTest()
{
//建立容器的方法與vector差不多 二三行可以取得它的疊代器與反轉疊代器
deque<int> data;
deque<int> ::iterator iter;
deque<int> ::reverse_iterator riter;
cout<<"please enter the value,zero will stop enter!"<<endl;
int value(0);
while(cin>> value , value!=0)
data.push_front(value);//在頭部插入 push_back在末尾插入
//用兩種疊代器周遊
cout<<"the values you enter!"<<endl;
for(iter=data.begin();iter !=data.end();iter++)
cout<<*iter<<" ";
cout<<endl;
cout<<"the values you enter!using reverse iter"<<endl;
for(riter=data.rbegin();riter !=data.rend();riter++)
cout<<*riter<<" ";
cout<<endl;
//把輸入的進行排序
cout<<endl<<"sort the value you input:"<<endl;
sort(data.rbegin(),data.rend());
//輸出排序後
cout<<"after the sort,value:"<<endl;
for(iter=data.begin();iter !=data.end();iter++)
cout<<*iter<<" ";
cout<<endl;
//算出總數
cout<<"the sum of the data:"<<accumulate(data.begin(),data.end(),0)<<endl;
/*容器的大緻方法都是差不多的 和vector差別不大*/
}
void listTest()//雙向連結清單 list不支援随機通路
{
list<string> names;
list<string> xbox(20);//empty of 20
list<int> element(10,2);//ten elements are all 2
//可以用size拿到容量 resize改變長度 與vector deque方法大體相同
//可以使用push方法在頭尾進行插入 也可以用insert方法在任意位置進行插入
cout<<"the elements contain:"<<endl;
for(auto iter =element.begin();iter!=element.end();iter++)
cout<<*iter<<" ";
element.insert(++element.begin(),30);//the second insert 30
cout<<endl<<"after inserting :"<<endl;
for(auto iter =element.begin();iter!=element.end();iter++)
cout<<*iter<<" ";
cout<<endl;
}