目錄
為永寧等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及永寧網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、成都做網(wǎng)站、永寧網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!1.vector介紹
2.vector使用
2.1.vector的定義
示例:
2.2.vector的遍歷?
1、operator[ ]
2、迭代器
3、for?
2.3.vector的空間增長(zhǎng)問(wèn)題
1、size和capacity
2、max_size
3、reserve?
4、resize?
2.4、vector的增刪查改?
1、push_back和pop_back
2、insert和erase
3、find
4、sort(不是成員函數(shù))
1. vector 是表示 可變大小數(shù)組 的 序列容器 。 2. 就像數(shù)組一樣, vector 也采用的連續(xù)存儲(chǔ)空間來(lái)存儲(chǔ)元素。也就是意味著可以采用下標(biāo)對(duì) vector 的元素 進(jìn)行訪問(wèn),和數(shù)組一樣高效。 但是又不像數(shù)組,它的大小是可以動(dòng)態(tài)改變的,而且它的大小會(huì)被容器自動(dòng)處理。 3. 本質(zhì)講, vector 使用動(dòng)態(tài)分配數(shù)組來(lái)存儲(chǔ)它的元素。 當(dāng)新元素插入時(shí)候,這個(gè)數(shù)組需要被重新分配,為了增加存儲(chǔ)空間。其做法是,分配一個(gè)新的數(shù)組,然后將全部元素移到這個(gè)數(shù)組。 就時(shí)間而言,這是一個(gè)相對(duì)代價(jià)高的任務(wù),因?yàn)槊慨?dāng)一個(gè)新的元素加入到容器的時(shí)候,vector 并不會(huì)每次都重新分配大小。 4. vector 分配空間策略: vector會(huì)分配一些額外的空間以適應(yīng)可能的增長(zhǎng),因?yàn)榇鎯?chǔ)空間比實(shí)際需要的存儲(chǔ)空間更大。 不同的庫(kù)采用不同的策略權(quán)衡空間的使用和重新分配。但是無(wú)論如何,重新分配都應(yīng)該是對(duì)數(shù)增長(zhǎng)的間隔大小,以至于在末尾插入一個(gè)元素的時(shí)候是在常數(shù)時(shí)間的復(fù)雜度完成的。 5. 因此, vector占用了更多的存儲(chǔ)空間,為了獲得管理存儲(chǔ)空間的能力,并且以一種有效的方式動(dòng)態(tài)增長(zhǎng)。 6. 與其它動(dòng)態(tài)序列容器相比( deque, list and forward_list) ,對(duì)于其它不在末尾的刪除和插入操作,效率更低。 比起list 和 forward_list統(tǒng)一的迭代器和引用更好。2.vector使用 2.1.vector的定義
(constructor)構(gòu)造函數(shù)聲明 接口說(shuō)明 1、vector();? ?(重點(diǎn)) 無(wú)參構(gòu)造 2、vector(size_type n, const value_type& val = value_type())
構(gòu)造并初始化n個(gè)val 3、vector (const vector& x);?(重點(diǎn)) 拷貝構(gòu)造 4、vector (InputIterator first, InputIterator last); 使用迭代器進(jìn)行初始化構(gòu)造
示例:2.2.vector的遍歷?1、vector()?無(wú)參構(gòu)造
int main() { vector
a;//存儲(chǔ)int類型數(shù)據(jù) vector v3;//存儲(chǔ)string類型數(shù)據(jù) } 2、vector(size_type n, const value_type& val = value_type())構(gòu)造并初始化n個(gè)val
vector
v1(10, 5);//用10個(gè)5來(lái)初始化v1 3、vector (const vector& x);?(重點(diǎn))
vector
v1(10, 5);//用10個(gè)5來(lái)初始化v1 vector v2(v1);//用v1去拷貝構(gòu)造v2 4、vector (const vector& x);?(重點(diǎn))
vector
v1(10, 5);//用10個(gè)5來(lái)初始化v1 vector v3(v1.begin(), v1.end());//使用迭代器拷貝構(gòu)造v2的數(shù)據(jù)
1、operator[ ]
接口名稱 使用說(shuō)明 1、operator[ ] 下標(biāo) + [ ] 2、迭代器 begin + end 或 rbrgin + rend 3、范圍for 底層還是借用迭代器實(shí)現(xiàn)
2、迭代器operator[ ]就是對(duì)[ ]的重載,是我們可以像C語(yǔ)言那樣使用下標(biāo) + [ ]去訪問(wèn)元素。
void test() { vector
num; num.push_back(1); num.push_back(2); num.push_back(3); for (size_t i = 0; i< num.size(); i++) { num[i] += 1; cout<< num[i]<< " "; // 2 3 4 5 } }
3、for?vector的迭代器和string的迭代器近乎一致,規(guī)則也都類似。
iterator的使用 接口說(shuō)明 1、begin + end begin獲取第一個(gè)數(shù)據(jù)位置的iterator/const_iterator,
end獲取最后一個(gè)數(shù)據(jù)的下一個(gè)位置的iterator/const_iterator
2、rbegin + rend rbegin獲取最后一個(gè)數(shù)據(jù)位置的reverse_iterator,
rend獲取第一個(gè)數(shù)據(jù)前一個(gè)位置的reverse_iterator
1.正向迭代器
void test() { vector
num; num.push_back(1); num.push_back(2); num.push_back(3); vector :: iterator it = num.begin(); while (it != num.end()) { *it *= 2; cout<< *it<< " "; // -1 -2 -3 it++; } } 2.反向迭代器
void test() { vector
num(10, 5); vector reverse_iterator v = num.rbegin(); while (rit != v.rend()) { cout<< *rit<< " "; rit++; } }
2.3.vector的空間增長(zhǎng)問(wèn)題范圍for的底層就是替換了迭代器,和string類類似。
?3、范圍for void test() { vector
num; num.push_back(1); num.push_back(2); num.push_back(3); //3、范圍for for (auto e : num) { cout<< e<< " "; //1 2 3 4 }
1、size和capacity
容量空間 接口說(shuō)明 1、size 獲取數(shù)據(jù)個(gè)數(shù) 2、capacity 獲取容量大小 3、max_size 判斷元素大個(gè)數(shù) 4、resize 改變vector中的size 5、reserve 改變vector的capacity
2、max_size作用:
vector的size是用來(lái)獲取有效數(shù)據(jù)個(gè)數(shù),而capacity就是獲取容量大?。?/p>
void test() { vector
v(7, 5); cout<< v.size()<< endl;//7 cout<< v.capacity()<< endl;//7 }
3、reserve?作用:
是返回vector容器可以容納的大元素?cái)?shù),用類型的大值除以sizeof(類型)即max_size。?
void test() { vector
v1; cout<< v1.max_size()<< endl;//1073741823 vector v2; cout<< v2.max_size()<< endl;//2147483647 }
4、resize?作用:
是請(qǐng)求更改容量capacity。
- 如果?n大于當(dāng)前容量,則該函數(shù)會(huì)導(dǎo)致容器重新分配其存儲(chǔ),將其容量增加到?n(或更大)。
- 在所有其他情況下,函數(shù)調(diào)用不會(huì)導(dǎo)致重新分配,且容量不會(huì)受影響。
void test() { vector
v(10, 5); cout<< v.capacity()<< endl;//10 //如果n >當(dāng)前容量大小,更新容量至n v.reserve(100); cout<< v.capacity()<< endl;//100 //如果n< 當(dāng)前容量大小,不做出任何改動(dòng) v.reserve(20); cout<< v.capacity()<< endl;//100 }
2.4、vector的增刪查改?resize在空間的同時(shí)也進(jìn)行了初始化。
如果 n 小于當(dāng)前容器大小,則內(nèi)容將減少到其前 n 個(gè)元素,刪除超出(并銷毀)的元素。
如果 n 大于當(dāng)前容器大小 ,則通過(guò)在末尾插入所需數(shù)量的元素以達(dá)到 n 的大小來(lái)擴(kuò)展內(nèi)容。如果指定了 val,則新元素將初始化為 val 的副本,否則,它們將進(jìn)行值初始化。void test() { vector
v(10, 5); cout<< v.size()<< endl;//10 cout<< v.capacity()<< endl;//10 //如果n的大小 >size和capacity,更新到n。超出的部分用1初始化 v.resize(100, 1); cout<< v.size()<< endl;//100 cout<< v.capacity()<< endl;//100 //如果n的大小< size,更新size到n,容量capacity不變 v.resize(50); cout<< v.size()<< endl;//50 cout<< v.capacity()<< endl;//100 //如果n的大小 >size,且< capacity,更新size到n,容量capacity不變 v.resize(70); cout<< v.size()<< endl;//50 cout<< v.capacity()<< endl;//100 }
1、push_back和pop_back
vector增刪查改 接口說(shuō)明 1、push_back 尾插 2、pop_back 尾刪 3、insert 在下標(biāo)為pos的前面插入val 4、erase 刪除下標(biāo)為pos的值 5、find 查找(注意這個(gè)是算法模塊實(shí)現(xiàn),不是vector的成員接口) 6、sort 排序(注意這里也不是vector的函數(shù)接口,只是用于排序)
void test()
{
vectorv;
v.push_back(1);
v.push_back(10);
v.pop_back();
v.pop_back();
}
2、insert和erase3、findinsert就是在下標(biāo)為pos的前面插入val,erase就是刪除下標(biāo)為pos的值。
void test9() { vector
v; v.push_back(1); v.push_back(10); //insert v.insert(v.begin(), 0); //在下標(biāo)為0的位置插入0 v.insert(v.begin(), 2, -1);//在下標(biāo)為0的位置往后插入兩個(gè)-1 for (auto e : v) cout<< e<< " "; //-1 -1 0 1 10 cout<< endl; v.insert(v.begin() + 3, 2);//在下標(biāo)為3的位置插入2 for (auto e : v) cout<< e<< " "; //-1 -1 0 2 1 10 cout<< endl; //erase v.erase(v.begin()); //頭刪 for (auto e : v) cout<< e<< " "; //-1 0 2 1 10 cout<< endl; v.erase(v.begin() + 3); //刪除下標(biāo)為3的值 for (auto e : v) cout<< e<< " "; //-1 0 2 10 cout<< endl; //刪除在該迭代器區(qū)間內(nèi)的元素(左閉右開(kāi)) v.erase(v.begin(), v.begin() + 3);//刪除下標(biāo)[0, 3)左閉右開(kāi)的值 for (auto e : v) cout<< e<< " ";//10 }
4、sort(不是成員函數(shù))這里的find并不是vector的成員函數(shù),這個(gè)是算法模塊實(shí)現(xiàn)。其本質(zhì)就是在一段左閉右開(kāi)的迭代器區(qū)間去尋找一個(gè)值。找到了就返回它的迭代器,找不到就返回它的開(kāi)區(qū)間那個(gè)迭代器。
void test() { vector
v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); //vector ::iterator pos = find(v.begin(), v.end(), 3); auto pos = find(v.begin(), v.end(), 3);//調(diào)用find在左閉右開(kāi)的區(qū)間內(nèi)尋找val if (pos != v.end()) { cout<< "找到了"<< endl; v.erase(pos);//找到后,把該值刪掉 } else { cout<< "沒(méi)有找到"<< endl; } for (auto e : v) cout<< e<< " "; //1 2 4 }
void test()
{
vectorv;
v.push_back(1);
v.push_back(-23);
v.push_back(30);
v.push_back(9);
v.push_back(0);
v.push_back(-90);
//默認(rèn)sort是升序
sort(v.begin(), v.end());
for (auto e : v)
cout<< e<< " "; //-90 -23 0 1 9 30
cout<< endl;
//要排降序,就要用到仿函數(shù),具體是啥后續(xù)詳談
sort(v.begin(), v.end(), greater());
for (auto e : v)
cout<< e<< " "; //30 9 1 0 -23 -90
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧