日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ vector,STL vector

發布時間:2025/3/12 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ vector,STL vector 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

vector 是順序容器的一種。vector 是可變長的動態數組,支持隨機訪問迭代器,所有 STL 算法都能對 vector 進行操作。要使用 vector,需要包含頭文件 vector。

在 vector 容器中,根據下標隨機訪問某個元素的時間是常數,在尾部添加一個元素的時間大多數情況下也是常數,總體來說速度很快。

在中間插入或刪除元素時,因為要移動多個元素,因此速度較慢,平均花費的時間和容器中的元素個數成正比。

在 vector 容器中,用一個動態分配的數組來存放元素,因此根據下標訪問某個元素的時間是固定的,與元素個數無關。

vector 容器在實現時,動態分配的存儲空間一般都大于存放元素所需的空間。例如,哪怕容器中只有一個元素,也會分配 32 個元素的存儲空間。這樣做的好處是,在尾部添加一個新元素時不必重新分配空間,直接將新元素寫入適當位置即可。在這種情況下,添加新元素的時間也是常數。

但是,如果不斷添加新元素,多出來的空間就會用完,此時再添加新元素,就不得不重新分配內存空間,把原有內容復制過去后再添加新的元素。碰到這種情況,添加新元素所花的時間就不是常數,而是和數組中的元素個數成正比。

至于在中間插入或刪除元素,必然涉及元素的移動,因此時間不是固定的,而是和元素個數有關。

vector中常用的成員函數

成員函數作 用
vector()無參構造函數,將容器初始化為空
vector(int n)將容器初始化為有 n 個元素
vector(int n, const T & val)假定元素的類型是 T,此構造函數將容器初始化為有 n 個元素,每 個元素的值都是 val
vector(iterator first, iterator last)first 和 last 可以是其他容器的迭代器。一般來說,本構造函數初始化的結果就是將 vector 容器的內容變成與其他容器上的區間 [first, last) —致
void clear()刪除所有元素
bool empty()判斷容器是否為空
void pop_back()刪除容器末尾的元素
void push_back( const T & val)將 val 添加到容器末尾
int size()返回容器中元素的個數
T & front()返回容器中第一個元素的引用
T & back()返回容器中最后一個元素的引用
iterator insert(iterator i, const T & val)將 val 插入迭代器 i 指向的位置,返回 i
iterator insert( iterator i, iterator first, iterator last)將其他容器上的區間 [first, last) 中的元素插入迭代器 i 指向的位置
iterator erase(iterator i)刪除迭代器 i 指向的元素,返回值是被刪元素后面的元素的迭代器
iterator erase(iterator first, iterator last)刪除容器中的區間 [first, last)
void swap( vector & v)將容器自身的內容和另一個同類型的容器 v 互換

示例 vector 的基本用法。

#include <iostream> #include <vector> //使用vector需要包含此頭文件 using namespace std; template <class T> void PrintVector(const vector <T> & v) { //用于輸出vector容器的全部元素的函數模板typename vector <T>::const_iterator i;//typename 用來說明 vector <T>::const_iterator 是一個類型,在 Visual Studio 中不寫也可以for (i = v.begin(); i != v.end(); ++i)cout << *i << " ";cout << endl; } int main() {int a[5] = { 1, 2, 3, 4, 5 };vector <int> v(a, a + 5); //將數組a的內容放入vcout << "1) " << v.end() - v.begin() << endl; //兩個隨機迭代器可以相減,輸出:1)5cout << "2)"; PrintVector(v); //輸出:2)1 2 3 4 5v.insert(v.begin() + 2, 13); //在 begin()+2 位置插人 13cout << "3)"; PrintVector(v); //輸出:3)1 2 13 3 4 5v.erase(v.begin() + 2); //刪除位于 begin()+2 位置的元素cout << "4)"; PrintVector(v); //輸出:4)1 2 3 4 5vector<int> v2(4, 100); //v2 有 4 個元素,都是 100v2.insert(v2.begin(), v.begin() + 1, v.begin() + 3); //將v的一段插入v2開頭cout << "5)v2:"; PrintVector(v2); //輸出:5)v2:2 3 100 100 100 100v.erase(v.begin() + 1, v.begin() + 3); //刪除 v 上的一個區間,即 [2,3)cout << "6)"; PrintVector(v); //輸出:6)1 4 5return 0; }

PrintVector 模板演示了將容器的引用作為函數參數的用法。就完成輸出整個容器內容這個功能來說,寫成 PrintVector 模板這樣是比較笨拙的,該模板的適用范圍太窄。有沒有更好的寫法?

vector 還可以嵌套以形成可變長的二維數組。例如:

#include <iostream> #include <vector> using namespace std; int main() { vector<vector<int> > v(3); //v有3個元素,每個元素都是vector<int> 容器for(int i = 0;i < v.size(); ++i)for(int j = 0; j < 4; ++j)v[i].push_back(j);for(int i = 0;i < v.size(); ++i) {for(int j = 0; j < v[i].size(); ++j)cout << v[i][j] << " ";cout << endl;}return 0; }

程序的輸出結果是:

0 1 2 3 0 1 2 3 0 1 2 3

vector< vector > v(3);定義了一個 vector 容器,該容器中的每個元素都是一個 vector 容器。即可以認為,v 是一個二維數組,一共 3 行,每行都是一個可變長的一維數組。

總結

以上是生活随笔為你收集整理的C++ vector,STL vector的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。