C++ STL 容器 vector
1 vector簡介
順序存儲, 初始化過程會分配一定量空間, 在尾部插入會很快, 但是在中間插入元素, 會把之后所有元素向后平移, 所以較慢(中間刪除元素同理). 如果元素個數超過當前限制, 會重新分配更大空間, 再把原容器中所有元素都拷貝到新的容器中.
- 優點: 支持隨機訪問(用下標訪問), 性能較好
- 缺點: 除了操作尾部元素, 增刪中間元素性能較差
2 vector接口
- push_back() 尾插數據
- pop_back() 尾刪數據
- front() 第一個元素
- back() 最后一個元素
構造:
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); }結果:
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; }結果為:
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; }結果:
?
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); }運行結果為:
用途如以下測試代碼:
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; }?結果是:
所以可以用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; }結果是:
原因是vector<int>(testVec).swap(testVec);調用時, 相當于用testVec創建了一個匿名對象vector<int> (testVec), 這個匿名對象的size和capacity都是10, 元素就是testVec的十個元素, 然后這個匿名對象和testVec作了交換之后, 匿名對象變成了十萬個元素, 而testVec變成了size和capacity都是10, 匿名對象在行結束后立刻銷毀, 所以原來哪個100000個元素的匿名對象就銷毀了, 這樣就達到了縮容的目的.
2.3 預留空間
reserve. 調用reserve可以減少重新分配空間的時間, 但是和resize不同的是, 元素不會被初始化為0.
比如有如下函數, 我們可以驗證vector在加入了100000個元素之后一共重新分配了多少次內存.有兩種方法:
- 看序列首元素地址改變了多少次
- 看vector的size和capacity相等了多少次
結果是:
發現重新分配了18次.我們可以用以下代碼來測試一下性能:
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; }結果為:
?
3 迭代器
假如有如下一個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最后元素的下一個位置?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C++ STL 容器 vector的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 一键登录插件,FastAdmin
- 下一篇: c++语言成绩统计系统数组,急求!!!关