C++ STL 容器 vector
1 vector簡(jiǎn)介
順序存儲(chǔ), 初始化過程會(huì)分配一定量空間, 在尾部插入會(huì)很快, 但是在中間插入元素, 會(huì)把之后所有元素向后平移, 所以較慢(中間刪除元素同理). 如果元素個(gè)數(shù)超過當(dāng)前限制, 會(huì)重新分配更大空間, 再把原容器中所有元素都拷貝到新的容器中.
- 優(yōu)點(diǎn): 支持隨機(jī)訪問(用下標(biāo)訪問), 性能較好
- 缺點(diǎn): 除了操作尾部元素, 增刪中間元素性能較差
2 vector接口
- push_back() 尾插數(shù)據(jù)
- pop_back() 尾刪數(shù)據(jù)
- front() 第一個(gè)元素
- back() 最后一個(gè)元素
構(gòu)造:
void vector_constructor_test() {int array[] = {0,1,2,3,4,5,6,7,8,9};vector<int> testVec = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array));TestUtils::getInstance()->showVector(testVec);vector<int> testVec1(testVec.begin(), testVec.end()); // copy [testVec.begin(), testVec.end())TestUtils::getInstance()->showVector(testVec1);vector<int> testVec2(&array[0], &array[8]); // copy array[0, 8)TestUtils::getInstance()->showVector(testVec2);vector<int> testVec3(10, 100);TestUtils::getInstance()->showVector(testVec3); // testVec3 have 10 elements, every element is 100vector<int> testVec4;testVec4.assign(testVec.begin(), testVec.end()); // copy testVec[begin(), end())TestUtils::getInstance()->showVector(testVec4); }結(jié)果:
2.1 vector容量和大小
void vector_size_capacity_test() {int array[] = {0,1,2,3,4,5,6,7,8,9};vector<int> testVec = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array));cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(15); // if resize number > vec.size(), willTestUtils::getInstance()->showVector(testVec); // fill with 0cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(5);TestUtils::getInstance()->showVector(testVec);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(15, 8);TestUtils::getInstance()->showVector(testVec);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl; }結(jié)果為:
2.2 增刪
void vector_add_delete_test() {int array[] = {0,1,2,3,4,5,6,7,8,9};vector<int> testVec = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array));testVec.push_back(10); // add to backTestUtils::getInstance()->showVector(testVec);testVec.pop_back(); // delete backTestUtils::getInstance()->showVector(testVec);testVec.insert(testVec.begin(), 10); // insert to headTestUtils::getInstance()->showVector(testVec);testVec.insert(testVec.begin(), 2, 100); // insert two 100 to headTestUtils::getInstance()->showVector(testVec);testVec.erase(testVec.begin()); // delete headTestUtils::getInstance()->showVector(testVec);testVec.erase(testVec.begin(), testVec.begin() + 2);// delete head to head + 2(not include head + 2)TestUtils::getInstance()->showVector(testVec);cout << "testVec.front(): " << testVec.front() << endl;cout << "testVec.back(): " << testVec.back() << endl; }結(jié)果:
?
2.2 互換
void vector_swap_test() {int array1[] = {0,1,2,3,4,5,6,7,8,9};vector<int> testVec1 = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array1));int array2[] = {10,11,12,13,14,15,16,17,18,19};vector<int> testVec2 = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array2));TestUtils::getInstance()->showVector(testVec1);TestUtils::getInstance()->showVector(testVec2);testVec1.swap(testVec2);TestUtils::getInstance()->showVector(testVec1);TestUtils::getInstance()->showVector(testVec2); }運(yùn)行結(jié)果為:
用途如以下測(cè)試代碼:
void vector_swap_test1() {vector<int> testVec;for (int i = 0; i < 100000; i ++) {testVec.push_back(i);}cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(10);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl; }?結(jié)果是:
所以可以用swap收縮:
void vector_swap_test1() {vector<int> testVec;for (int i = 0; i < 100000; i ++) {testVec.push_back(i);}cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(10);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;vector<int>(testVec).swap(testVec);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl; }結(jié)果是:
原因是vector<int>(testVec).swap(testVec);調(diào)用時(shí), 相當(dāng)于用testVec創(chuàng)建了一個(gè)匿名對(duì)象vector<int> (testVec), 這個(gè)匿名對(duì)象的size和capacity都是10, 元素就是testVec的十個(gè)元素, 然后這個(gè)匿名對(duì)象和testVec作了交換之后, 匿名對(duì)象變成了十萬(wàn)個(gè)元素, 而testVec變成了size和capacity都是10, 匿名對(duì)象在行結(jié)束后立刻銷毀, 所以原來哪個(gè)100000個(gè)元素的匿名對(duì)象就銷毀了, 這樣就達(dá)到了縮容的目的.
2.3 預(yù)留空間
reserve. 調(diào)用reserve可以減少重新分配空間的時(shí)間, 但是和resize不同的是, 元素不會(huì)被初始化為0.
比如有如下函數(shù), 我們可以驗(yàn)證vector在加入了100000個(gè)元素之后一共重新分配了多少次內(nèi)存.有兩種方法:
- 看序列首元素地址改變了多少次
- 看vector的size和capacity相等了多少次
結(jié)果是:
發(fā)現(xiàn)重新分配了18次.我們可以用以下代碼來測(cè)試一下性能:
void vector_allocate_test2(){double startTime = TestUtils::getInstance()->getNowMillisecond();vector<int> testVec1;for (int i = 0; i < 100000; i ++) {testVec1.push_back(i);}double endTime = TestUtils::getInstance()->getNowMillisecond();cout << "use " << endTime - startTime << "ms" << endl;startTime = TestUtils::getInstance()->getNowMillisecond();vector<int> testVec2;testVec2.reserve(100000);for (int i = 0; i < 100000; i ++) {testVec2.push_back(i);}endTime = TestUtils::getInstance()->getNowMillisecond();cout << "use " << endTime - startTime << "ms after reserve" << endl; }結(jié)果為:
?
3 迭代器
假如有如下一個(gè)vector:
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))vector<int> intVec; int array[] = {0, 1, 2, 3, 4, 5}; for (int i = 0; i < ARRAY_SIZE(array); i ++) {inVec.push_back(arr[i]); }那么如下迭代器:
vector<int>::iterator beginIter = intVec.begin(); //beginIter指向vector首元素vector<int>::iterator endIter = intVec.end(); //endIter指向vector最后元素的下一個(gè)位置?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的C++ STL 容器 vector的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 一键登录插件,FastAdmin
- 下一篇: c++语言成绩统计系统数组,急求!!!关