標籤:
C++順序容器
一、 C++數組的描述
一維數組的動態記憶體分配:
Int *num=new int[len];
delete []num;
二維數組的動態記憶體分配:
1、知第二維
char (*num)[N];//指向數組的指標
num = newchar[m][N];
delete[]num;
2、知第一維
char*num [M];//指標的數組
for(int i=0; i<M; i++)
num[i] = new char[n];
for(i=0; i<M; i++)
delete[]num [i];
delete[]num;
3、已知一維 分配記憶體(保證記憶體的連續性)
char*num [M];//指標的數組
num [0] = new char[M*n];
for(int i=1; i<M; i++)
num [i] = num [i-1] + n;
delete[] a[0];
4、兩維都未知
char** num;
num = new char* [m];//分配指標數組
for(int i=0; i<m; i++)
num[i] = new char[n];
for(i=0; i<m; i++)
delete[]num [i];
delete[]num;
5、兩維都未知,一次分配記憶體(保證記憶體的連續性)
char ** num;
num = new char* [m];
num [0] = new char[m * n];//一次性分配所有空間
for(int i=1; i<m; i++)
num[i] = num [i-1] + n;//分配每個指標所指向的數組
delete[]num [0];
delete[]num;
二、 C++容器類型
Vector 可變大小數組 隨機訪問方便
Deque 雙端隊列 隨機訪問方便
List 雙向鏈表 容器中間插入刪除很方便 如果有很多的小元素 額外開銷很嚴重
Forward_list 單向鏈表 容器中間插入刪除很方便 如果有很多的小元素 額外開銷很嚴重
Array 固定大小數組
String 用以儲存字串
容器的操作:
1、向容器中添加元素:
push_back---除了array和forward_list以外,push_back從尾部添加一個元素;
push_front==list、forward_list、deque容器支援push_forward將元素從頭插入;
intsert—vector ,string,list,deque都支援insert成員,forward_list支援特殊的insert。
emplace—新標準引入三個成員,,emplace_front,emplace,emplace_back是構造而不是拷貝元素,
2、在順序容器中訪問元素的操作:
Vector<string>c;
c.back();//返回c中尾部的引用,若c為空白,函數行為未定義;
c.front();//返回c中頭部的引用,若c為空白,函數行為未定義;
c[n];
c.at(n);//返回下標為n的引用,如果下標越界,則標出異常
注意:at操作只是適用於string vector deque array操作;back不適用與forward_list.
3、刪除操作:
Vector <string>c;
c.push_back();
c.push_front();
c.erase(p);
c.erase(b,e);
c.clear();
注意:刪除元素的成員函數不檢查其參數,在刪除之前,必須保證它們存在。
4、(單向鏈表)forward_list的特殊使用{插入刪除操作}
Forward_list<int>fist;
fist.before_begin()
fist.cbefore_begin();
fist.insert_after();
emplace_after();
fist.erase_after();
5、改變容器大小
C.resize(n);
C.resize(n,t);
6、管理容量的成員函數
Vector<string> c;
c.shrink_yo_fit);只適用於vector string deque,將capacity()減少為size()的大小。
c.capacity();不重新分配記憶體的情況下 可以存貯多少元素
c.reserve(n);分配至少能容納n的記憶體空間。
7、容器適配器
size_type – 一種類型,足以儲存當前類型的最大值
value_type—元素類型
container_type—實現適配的底層類型
範例程式碼如下:
#include<iostream>#include<string> #include<vector> using namespace std;int main(){/*//容器的定義以及初始化//一個容器拷貝到咯、另一個容器list<string> str({"fht","hjs","hut"});vector<const char*> str1("a","b","bcx");//拷貝forward_list<string> words(str1.begin(),str1.end()); deque<string> nu(str.begin(),it);//使用assign賦值(僅適用於順序容器)str.assign(str1.cbegin(),str1.cend());//使用swap交換兩個相同的容器vector<string> a1(10);vector<string> a2(24);swap(a1,a2);//從尾部加入元素string word;vector<string> contains;while(cin>>word){contains.push_back(word); } //從頭部插入元素list<string> li1;while(cin>>word){li1.push_front(word);}//從容器的特定位置插入vector<string> v2;list<string> li2;li2.insert(li2.begin(),"hello");li2.insert(v2.begin(),"hello");//vector雖然不支援從頭部插入但是可以用這種方式插入,但是這樣速度會很慢//forward_list的使用forward_list<string> fist={1,23,4,5,6,6,7,7,8,8,8,665,56,789,6,6,5,5,99,65,78};auto one=fist.before();//目前元素auto two=fist.begin();while(curr!=fist.end()){if(*curr%2)curr=fist.erase_after(one);else one=curr;++curr; }*/ //管理容量成員函數vector<int> num;cout<<"size()="<<num.size()<<endl;cout<<"capacity()="<<num.capacity()<<endl;for(vector<int>::size_type i=0;i!=40;i++){num.push_back(i+23);} cout<<"size()新1="<<num.size()<<endl;cout<<"capacity()新1="<<num.capacity()<<endl;num.reserve(90);cout<<"size()新2="<<num.size()<<endl;cout<<"capacity()新2="<<num.capacity()<<endl;//如果在添加資料,又應該什麼變化呢?for(int i=0;i<60;i++) num.push_back(67+i);num.insert(num.begin(),12334);cout<<"添加後size()="<<num.size()<<endl;cout<<"添加後capacity()="<<num.capacity()<<endl; //將分配超出的記憶體歸還記憶體num.shrink_to_fit();cout<<"size()="<<num.size()<<endl;cout<<"歸還後capacity()="<<num.capacity()<<endl; //讀取vector中資料cout<<"容器裡的資料是:"; for(int i=0;i<num.size();i++){cout<<num[i]<<" ";} //string 的額外操作const char *cp="Hello world!";char noNull[]={'h','i'};string s1(cp);string s2(cp,6,20);cout<<s1<<" "<<s2<<" "<<endl;string s("Hello world!");string s3=s.substr(0,7);s.insert(s.size()-2,5,'?');cout<<s<<" "<<endl;s.erase(s.size()-5,5);cout<<s<<" "<<endl;//assgin方法s.assign(cp,13);cout<<s<<" "<<endl;//append方法s2.append(" ffh,sbx fy and fy");cout<<s2<<" "<<endl;s2.replace(11,4,"ffh,sbx");cout<<s2<<" "<<endl;//string搜尋操作string name("anfsdkjhgjs dfngndfmgnd sdghsdfjg"),nu("dhfhj");auto posl=name.find("js");//全部匹配cout<<posl<<endl;auto po=nu.find_first_of(name);//任意一個匹配cout<<po<<endl;system("pause");return 0;}
(全文完)
C++順序容器學習小結