2020-02-25 C++提高編程05-基本框架

關(guān)鍵字: vector容器? deque容器

3.2 vector容器

3.2.1基本概念

功能:vector數(shù)據(jù)結(jié)構(gòu)和數(shù)組非常相似,也稱為單端數(shù)組,在尾端可以進(jìn)行插入刪除操作;

vector與普通數(shù)組區(qū)別:數(shù)組為靜態(tài)空間,vector可以動態(tài)擴(kuò)展

注:vector容器的迭代器是支持隨機(jī)訪問的迭代器

動態(tài)擴(kuò)展

并不是在原空間之后續(xù)接新空間,而是找更大的內(nèi)存空間,然后將原數(shù)據(jù)拷貝新空間,釋放原空間;

vector容器的迭代器是支持隨機(jī)訪問的迭代器

3.2.2 vector構(gòu)造函數(shù)

函數(shù)原型:

1 vector<T> v;//采用模板實現(xiàn)類實現(xiàn),默認(rèn)構(gòu)造函數(shù)

2 vector(v.begin(),v.end());//將v[begin(),end())區(qū)間中的元素拷貝給本身

3 vector(n,elem);//構(gòu)造函數(shù)將n個elem拷貝給本身

4 vector(const vector &vec);//拷貝構(gòu)造函數(shù)

示例:

void test01()

{

vector<int> v1;

vector<int> v2(v1.begin(), v1.end());

vector<int> v3(10, 100);

vector<int> v4(v3);

}

3.2.3 vector賦值操作

函數(shù)原型:

1 vector &operator=(const vector &vec);

2 assign(beg,end);//左開右閉

3 assign(n,elem);

示例:

void test01()

{

vector<int> v1;

for (int i = 0; i < 10; ++i)

{

v1.push_back(i);

}

vector<int> v2 = v1;

vector<int> v3;

v3.assign(v1.begin(), v1.end());

vector<int> v4;

v4.assign(10, 100);

}

3.2.4 vector容量和大小

函數(shù)原型:

1 empty();//判空

2 capacity();//容量

3 size();//返回容器中元素個數(shù)

4 resize(int num);//重新指定容器長度,若容器變長,以默認(rèn)值填充;若變短,則末尾元素被刪除;

5 resize(int num, elem);//重新指定容器長度,若容器變長,以elem值填充;

3.2.5 vector插入和刪除

函數(shù)原型:

1 push_back(ele);//尾插

2 pop_back();//刪除最后一個元素

3 insert(const_iterator pos, ele);//迭代器指向位置pos插入元素ele)

4 insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count個元素ele)

5 erase(const_iterator pos);//刪除迭代器指向元素

6 erase(const_iterator start, const_iterator end);//刪除迭代器從start到end之間的元素

7 clear();//刪除容器中所有元素

3.2.6 vector數(shù)據(jù)存取

函數(shù)原型:

1 at(int idx);//返回索引idx所指的數(shù)據(jù)

2 operator[];//返回索引idx所指的數(shù)據(jù)

3 front();//返回容器中第一個數(shù)據(jù)元素

4 back();//返回容器中最后一個數(shù)據(jù)元素

3.2.7 vector互換容器

功能:實現(xiàn)兩個容器內(nèi)元素進(jìn)行互換

函數(shù)原型:swap(vec);

用途:收縮內(nèi)存

示例:

void test02()

{

vector<int> v;

for (int i = 0; i < 1000; ++i)

{

v.push_back(i);

}

cout << "capacity: " << v.capacity()<< endl;

cout << "size: " << v.size() << endl;

v.resize(3);//重新指定大小 容量不變

cout << "capacity: " << v.capacity() << endl;

cout << "size: " << v.size() << endl;

//巧用swap收縮內(nèi)存

vector<int>(v).swap(v);

//vector<int>(v)//匿名對象 調(diào)用拷貝構(gòu)造函數(shù)

//按照v目前所用元素個數(shù)初始化該匿名對象

//匿名對象當(dāng)前行結(jié)束系統(tǒng)自動回收

cout << "capacity: " << v.capacity() << endl;

cout << "size: " << v.size() << endl;

}

3.2.8 vector預(yù)留空間

功能:減少vector動態(tài)擴(kuò)展容量時的擴(kuò)展次數(shù)

函數(shù)原型:reserve(int len);//容器預(yù)留len個元素長度,預(yù)留位置不初始化,元素不可訪問

示例:

void test01()

{

//統(tǒng)計擴(kuò)展(開辟空間)次數(shù)

int num = 0;

int *p = NULL;

vector<int> v1;

//利用reserve預(yù)留空間

v1.reserve(100000);

for (int i = 0; i < 100000; ++i)

{

v1.push_back(i);

if (p != &v1[0])

{

p = &v1[0];

++num;

}

}

cout << "num = " << num << endl;

}

3.3 deque容器

3.3.1 deque容器基本概念

功能:雙端數(shù)組,可以對頭端進(jìn)行插入刪除操作

deque和vector區(qū)別:

1 vector對于頭部的插入刪除效率低,數(shù)據(jù)量越大,效率越低

2 deque相對而言,對頭部的插入刪除速度比vector快

3 vector訪問元素的速度會比deque快,這和兩者內(nèi)部實現(xiàn)有關(guān)

deque內(nèi)部工作原理:

deque內(nèi)部有個中控器,維護(hù)每段緩沖區(qū)中的內(nèi)容,緩沖區(qū)中存放真實數(shù)據(jù)

中控器維護(hù)的是每個緩沖區(qū)的地址,使得使用deque時像一片連續(xù)的內(nèi)存空間

注:deque容器迭代器也是支持隨機(jī)訪問的

3.3.2 deque構(gòu)造函數(shù)

函數(shù)原型:

1 deque<T> deqT;//默認(rèn)構(gòu)造

2 deque(beg,end);//構(gòu)造函數(shù)將[begin,end)區(qū)間中的元素拷貝給本身

3 deque(n,elem);//構(gòu)造函數(shù)將n個elem拷貝給本身

4 deque(const deque &deq);//拷貝構(gòu)造函數(shù)

3.3.3 deque賦值操作

函數(shù)原型

1 deque &operator=(const deque &deq);

2 assign(beg,end);

3 assign(n,ele);

3.3.4 deque大小操作

函數(shù)原型

1 deque.empty();

2 deque.size();

3 deque.resize(num);//以默認(rèn)值0填充

4 deque.resize(num,elem);//以elem填充

注:deque容器不存在容量的概念,因為容量不受限制,

可以無限開辟新空間,中控器只需增加地址;

3.3.5 deque插入和刪除

函數(shù)原型:

兩端操作:

1 push_back(elem);

2 push_front(elem);

3 pop_back();

4 pop_front();

指定位置操作:

1 insert(pos,elem);//在pos位置插入一個elem元素的拷貝,返回新數(shù)據(jù)位置

2 insert(pos,n,elem);//在pos位置插入n個elem,無返回值

3 insert(pos,beg,end);//插入一個區(qū)間數(shù)據(jù)。無返回值

4 clear();

5 erase(beg,end);//刪除區(qū)間數(shù)據(jù),返回下一個數(shù)據(jù)位置

6 erase(pos);//刪除pos位置數(shù)據(jù),返回下一數(shù)據(jù)的位置

3.3.6 deque數(shù)據(jù)存取

函數(shù)原型

1 at(int idx);

2 operator[];

3 front();

4 back();

3.3.7 deque排序

函數(shù)原型

sort(iterator beg,iterator end);//對區(qū)間內(nèi)的元素進(jìn)行排序

注:頭文件 <algorithm>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容