C++順序容器學習小結

來源:互聯網
上載者:User

標籤:

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++順序容器學習小結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.