可以做pos機(jī)的網(wǎng)站關(guān)鍵詞排名怎么查
vector的使用
- 1.vector的介紹
- 2.vector的使用
- 3.Member functions
- 3.1構(gòu)造函數(shù)
- 3.2拷貝構(gòu)造
- 3.3賦值運(yùn)算符重載
- 4.iterator
- 5.capacity
- 6.Element access
- 7.增刪查改
- 7.1增
- 7.2刪
- 7.3查
- 7.4改
1.vector的介紹
1.vector是表示可變大小數(shù)組的序列容器.
2.vector也采用連續(xù)空間存儲元素,所以vector可以采用下標(biāo)的方法對元素進(jìn)行訪問,但是又不想數(shù)組,它的大小是可以動態(tài)改變的。
3.vector動態(tài)分配數(shù)組來存儲它的元素,當(dāng)新元素插入時,可能需要重新分配空間,把全部元素移到這個數(shù)組。就時間而言,這是一個比較大的開銷,但是并不是每次插入元素,vector都會擴(kuò)容。
4.vector會分配額外多的空間以適應(yīng)可能的增長,所以存儲空間要比實(shí)際需要的存儲空間更大。不同庫采用不同的方法來進(jìn)行空間的分配。
5.與其他動態(tài)系列容器相比(deques,lists…),vector訪問元素時更加高效,在末尾插入和刪除也更高效,對于不在末尾插入和刪除的操作,效率更低。
2.vector的使用
學(xué)習(xí)容器一定要學(xué)會查看文檔,vector的文檔介紹,下面我們介紹一些重點(diǎn)掌握的接口
3.Member functions
(constructor)構(gòu)造函數(shù)聲明 | 接口說明 |
---|---|
vector()(重點(diǎn)) | 無參構(gòu)造 |
size_type n, const value_type& val = value_type() | 構(gòu)造并初始化n個val |
vector (const vector& x); (重點(diǎn)) | 拷貝構(gòu)造 |
vector (InputIterator first, InputIterator last) | 使用迭代器進(jìn)行初始化構(gòu)造 |
3.1構(gòu)造函數(shù)
3.2拷貝構(gòu)造
vector<int> v3(v2);for (auto e : v3){cout << e << " ";}cout << endl;
3.3賦值運(yùn)算符重載
4.iterator
iterator的使用 | 接口說明 |
---|---|
begin(重點(diǎn)) | 獲取第一個數(shù)據(jù)位置的iterator/const_iterator |
end (重點(diǎn)) | 獲取最后一個數(shù)據(jù)的下一個位置的iterator/const_iterator |
rbegin | 獲取最后一個數(shù)據(jù)位置的reverse_iterator |
rend | 獲取第一個數(shù)據(jù)前一個位置的reverse_iterator |
void test2()
{//先拷貝構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換,然后再走拷貝構(gòu)造函數(shù)vector<int> v = {1,2,3,4,5,6,7,8,9,10};//iterator通用的訪問方式vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;
}//范圍for底層被替換成迭代器,這里不再敘述
到這里可能會覺得vector ,string看似相似;其實(shí)vector并不能替代string
1.接口不一樣
2.string以\0結(jié)尾,vector不一定
3.如比較大小,vector不一定是字符
5.capacity
補(bǔ)充知識:
int main()
{//請問這里i和k是說明結(jié)果呢?int i = int();int k = int(10);return 0;
}
發(fā)現(xiàn)內(nèi)置類型,有了構(gòu)造。這是因?yàn)橛辛四0逯?#xff0c;為了兼容模板,不知道T到底是自定義類型還是內(nèi)置類型,如果是內(nèi)置類型難道就報錯嗎?
所以有了模板之后,內(nèi)置類型有了構(gòu)造。
容量空間 | 接口說明 |
---|---|
size | 獲取數(shù)據(jù)個數(shù) |
capacity | 獲取容量大小 |
empty | 判斷是否為空 |
resize(重點(diǎn)) | 改變vector的size |
reserve (重點(diǎn)) | 改變vector的capacity |
看不懂上面的形參,可以參照下面的
void test3()
{vector<int> v;//改變v的size大小,并且初始化v.resize(10);for (auto e : v){cout << e << " ";}cout << endl;
}
這里就可以把剛才補(bǔ)充的知識點(diǎn)解釋清楚,為什么要有內(nèi)置類型構(gòu)造?
不可能T都是自定義類型,T如果是內(nèi)置類型就報錯嗎?
所以有了模板之后內(nèi)置類型構(gòu)造有了意義。
resize有三種情況
1.n<size
刪除數(shù)據(jù)
2.size<n<capacity
插入數(shù)據(jù)
3.n>capacity
擴(kuò)容+插入數(shù)據(jù)
void test3()
{//測試vs下vector擴(kuò)容機(jī)制size_t capacity = v.capacity();cout << "capacity:" << capacity << endl;for (int i = 0; i < 1000; ++i){v.push_back(i);if (capacity != v.capacity()){capacity = v.capacity();cout << "capacity changed:" << capacity << endl;}}
}
我們知道頻繁擴(kuò)容,會有時間開銷,如果我們提前知道要開辟空間大小,這樣就減少了擴(kuò)容的時間開銷。
不同編譯器擴(kuò)容機(jī)制是不一樣的。和string一樣,在Linux下每次擴(kuò)容2倍。
注意:
resize,reserve比當(dāng)前容量小時,都不會縮容。
這里以時間換空間。
如何就想縮容,使用下面這個函數(shù)
把空間縮到size;
6.Element access
訪問 | 接口說明 |
---|---|
operator[] (重點(diǎn)) | 像數(shù)組一樣訪問 |
void test4()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (size_t i = 0; i < v.size(); ++i){cout << v[i] << " ";}cout << endl;}
const和非const函數(shù)在string詳細(xì)說明,這里不再敘述。
這里其實(shí)有一個問題,如果不小心真的很容易犯錯誤。
v.[i]是報斷言錯誤,v.at(i)拋異常。
所以這樣的去訪問一定要注意。
解決方法
pusk_back沒有那種檢查機(jī)制,就沒問題。
設(shè)置size大小
7.增刪查改
vector增刪查改 | 接口說明 |
---|---|
push_back(重點(diǎn)) | 尾插 |
pop_back (重點(diǎn)) | 尾刪 |
find | 查找。(注意這個是算法模塊實(shí)現(xiàn),不是vector的成員接口) |
insert | 在position之前插入val |
erase | 刪除position位置的數(shù)據(jù) |
swap | 交換兩個vector的數(shù)據(jù)空間 |
7.1增
push_back
push_back 不直接頭插(需要挪動數(shù)據(jù),效率低,建議少用)
insert
7.2刪
pop_back
erase
7.3查
vector沒有實(shí)現(xiàn)find成員函數(shù),因?yàn)関ector,list等等都是找到返回位置,所以算法庫里實(shí)現(xiàn)了模板,可以使用。
void test6()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);auto it = find(v.begin(), v.end(), 3);if (it != v.end()){v.insert(it, 30);}
}
7.4改
改的話就用迭代器+[ ]就可以了。
關(guān)于vector接口的使用就說到這里,下一篇來模擬實(shí)現(xiàn)vector。喜歡的點(diǎn)贊,評論,收藏加關(guān)注哦。