-----------------------------2019/01/15-------------------------------
復習了下迭代器,其實c++參考里講的很清楚,主要需要辨析規則如下:
1. begin()指向vector第一個元素, end()指向vector最后一個元素的下一個地址(尾后迭代器off-the-end iterator);
2. insert()是向當前地址前插入,返回第一個插入的元素地址;
3. erase()是從當前地址開始,向后刪除,返回刪除以后的下一個地址,如果刪除到最后一個元素,返回end()
具體如圖:

--------------------2019.01.19-------------------------------------------------------------------------
vector添加時間:push_back<尾部insert<頭部insert
clock_t start, finish; std::vector<int> v_data, v_data2, v_data3; start = clock(); for(int i = 0;i<200000;i++){ int data = std::rand()%100; v_data.push_back(data); } finish = clock(); printf("\npush_back used %.2f ms\n", (double)(finish-start)*1000/CLOCKS_PER_SEC); start = clock(); for(int i = 0;i<200000;i++){ int data = std::rand()%100; v_data2.insert(v_data2.end(), data); } finish = clock(); printf("\ninsert form tail used %.2f ms\n", (double)(finish-start)*1000/CLOCKS_PER_SEC); start = clock(); for(int i = 0;i<200000;i++){ int data = std::rand()%100; v_data3.insert(v_data3.begin(), data); } finish = clock(); printf("\ninsert form head used %.2f ms\n", (double)(finish-start)*1000/CLOCKS_PER_SEC);
輸出:
push_back used 5.43 ms
insert form tail used 8.39 ms
insert form head used 2081.38 ms
-------------------2019.02.06---------------------------------------
據說emplace_back()比push_back()更快
-------------------2019.02.09---------------------------------------
判斷兩個vector是否相等:
1. 如果[1,6] [6,1]是不同的vector,直接用==判斷即可,stl內置
2. 如果不考慮元素順序,且內部沒有重復元素,可以用set實現,但是對[1,1,2] vs. [1,2,1]這種無力
3. 針對1 2不適用的情況,自己琢磨着可能需要先排序再逐個比較
-------------------2019.02.27--------------------------------------
vector的初始化
// 二維 vector<vector<int>> test = {{1,1},{1,2}}; for(int i=0;i<test.size();i++){ for(int j=0;j<test[i].size();j++){ std::cout<<test[i][j]<<" "; } std::cout<<std::endl; } // 一維 vector<int> desp = {1, 3, 4, 1, 1, 1}; for(int i=0;i<desp.size();i++){ std::cout<<desp[i]<<" "; }
輸出:

沒見過這種初始化方法,之前一直是定義一個數組a[],然后vector<int> v(a,a+sizeof(a)/sizeof(int)),覺得還怪麻煩的,難道是c++新特性?
1. 定義
vector 是C++容器種特別常用的一種,用法:vector<int> a;c++11里定義了6種構造函數。
int aNum[10] = { 1, 3, 5, 6, 9, 11, 13, 15, 17, 19 }; vector<int> myVector(2,1); //定義一個2個元素的vector,並初始化為1 for (auto it = myVector.begin(); it != myVector.end(); it++) cout << *it << ' '; cout << endl; //用數組aNum的值初始化vector vector<int> myNum(aNum, aNum + sizeof(aNum) / sizeof(int)); for (auto it = myNum.begin(); it != myNum.end(); it++) cout << *it << ' '; cout << endl; //截取myNum的后半部分 int medium = myNum.size() / 2; vector<int> new_nums((myNum.begin() + medium), myNum.end()); for (auto it = new_nums.begin(); it != new_nums.end(); it++) cout << *it << ' '; cout << endl;
//去除myNum向量的前5個元素
myNum.erase(myNum.begin(), myNum.begin() + 5);
輸出:

2. insert
根據 c++ STL中的vector在內存中的分配與釋放,vector內容和數組一樣,是連續分配內存空間的,不同的是,在給vector分配內存時,會比實際需要的多一些,預留出以后插入的空間。
根據 c++ reference, 對vector.insert的描述,當向vector的末尾(vector.end())插入時,直接插入就好了,除非預留空間不夠,才會重新分配內存。
如果向vector中間的某個位置插入,那么,由於vector的底層實現還是數組,插入點以后的所有節點都需要重新分配內存。
這樣操作效率很低,所以如果需要向序列中間插入元素,c++ reference建議使用鏈表。

3. size
myVector.size()返回vector里有多少個有效的元素,不是vector實際占用的存儲空間。
myVector.resize(n,val)改變的是vector包含有效元素的個數,如果n<ori,直接扔掉多的那些;n>ori,末尾增加n-ori個新元素,根據val值初始化。如果n超過了capacity,要重新分配內存。
myVector.capacity返回給vector分配的存儲空間。

