C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)
1. vector 特點
vector 是一個模板類,提供了動態(tài)數(shù)組的通用功能,具有如下特點:
- 在數(shù)組末尾添加元素所需的時間是固定的,即在末尾插入元素的所需時間不隨數(shù)組大小而異,在末尾刪除元素也如此;
- 在數(shù)組中間添加或刪除元素所需的時間與該元素后面的元素個數(shù)成正比;
- 存儲的元素數(shù)是動態(tài)的,而
vector類負責管理內(nèi)存;
要使用 std::vector 類,需要包含下面的頭文件:
#include <vector>
2. 實例化 vector
要實例化 vector ,需要指定要在該動態(tài)數(shù)組中存儲的對象類型:
std::vector<int> i;
std::vector<float> f;
要聲明指向 list 中元素的迭代器,可以這樣做:
std::vector<int>::const_iterator elementInVec;
如果需要可用于修改值或調(diào)用非 const 函數(shù)的迭代器,可使用 iterator 代替 const_iterator 。
下面代碼演示了幾種實例化 vector 的方式:
#include <vector>
#include <iostream>using namespace std;void print(vector<int> vectorName)
{for(size_t i=0; i<vectorName.size(); i++){cout << vectorName[i] << endl;}
}int main ()
{vector<int> a; // 1. 默認構(gòu)造函數(shù)實例化cout << "a.size() is " << a.size() << endl;vector<int> b {1,2,3}; // 2. 使用 c++ 11 列表初始化cout << "b.size() is " << b.size() << endl;print(b);vector<int> c (5); // 3. 初始化 vector 為 5 個元素cout << "c.size() is " << c.size() << endl;print(c);vector<int> d (3, 10); // 4. 初始化 vector 為 3 個元素,每個元素為 10cout << "c.size() is " << c.size() << endl;print(d);vector<int> e (d); // 5. 將 vector d 初始化為 e 的值cout << "e.size() is " << e.size() << endl;print(e);// 6. 初始化 f 為 5 個元素,并且是 vector d 的前 5 個元素vector<int> f (d.cbegin(), d.cbegin()+5);cout << "f.size() is " << f.size() << endl;print(f);return 0;
}
上述代碼演示了如何為整型具體化 vector 類,即實例化一個存儲整型數(shù)據(jù)的 vector 。該 vector 名為 a,它使用了默認構(gòu)造函數(shù),如第 16 行所示。在不知道容器最小需要多大,即不知道要存儲多少個整數(shù)時,默認構(gòu)造函數(shù)很有用。
3. 使用 push_back( )在末尾插入元素
在 vector 中插入元素時,元素將插入到數(shù)組末尾,這是使用成員函數(shù) push_back() 完成的:
std::vector <int> a; // 聲明一個 int 型的 vector
// 插入數(shù)據(jù)
a.push_back(50);
a.push_back(1);
完整示例:
int main ()
{std::vector<int> a; // 聲明 vector astd::cout << "a.size() is " << a.size() << std::endl; // a.size() is 0a.push_back(10);a.push_back(5);a.push_back(1);std::cout << "a.size() is " << a.size() << std::endl; // a.size() is 3return 0;
}
4. 列表初始化
C++11 通過 std::initialize_list<> 支持列表初始化,讓您能夠像處理靜態(tài)數(shù)組那樣,在實例化 vector 的同時初始化其元素。與大多數(shù)容器一樣, std::vector 也支持列表初始化,讓您能夠在實例化 vector 的同時指定其元素:
std::vector<int> a = {50, 1, 987, 1001};
// 或者
std::vector<int> a {50, 1, 987, 1001};
5. 使用 insert( )在指定位置插入元素
push_back() 在 vector 末尾插入元素。如果要在中間插入元素,可以使用 insert 。有以下幾種插入方式:
- 插入指定的位置
vector<int> a;
a.insert(a.begin(), 25);
a.insert(a.begin()+2, 25);
- 指定插入位置、要插入的元素數(shù)以及這些元素的值(都相同)
a.insert (a.end(), 2, 45); // 插入兩個元素均為 45 的值
- 將另一個
vector的內(nèi)容插入到指定位置:
vector <int> b (2, 30);
a.insert (a.begin() + 1, b.begin (), b.end ());
雖然函數(shù) vector::insert() 用途廣泛,但給 vector 添加元素時,應首選 push_back() 。這是因為將元素插入 vector 時, insert() 可能是效率最低的(插入位置不是末尾時),因為在開頭或中間插入元素時,將導致 vector 類將后面的所有元素后移(為要插入的元素騰出空間)。
根據(jù)容器中包含的對象類型,這種移動操作可能需要調(diào)用復制構(gòu)造函數(shù)或賦值運算符,因此開銷可能很大。在上述例子中, vector 包含的是 int 對象,移動開銷不是很大。但在其他情況下,情況可能并非如此。
注意:如果需要頻繁地在容器中間插入元素,應選擇 std::list 。
6. 使用數(shù)組語法訪問 vector 中的元素
可使用下列方法訪問 vector 的元素:
- 使用下標運算符
[]以數(shù)組語法方式訪問;
std::vector<int> tenElements (10);
// 可使用類似于數(shù)組的語法訪問并設(shè)置各個元素:
tenElements[3] = 2011; for (size_t index = 0; index < integers.size(); ++index)
{cout << "Element[" << index << "] = " ;cout << integers[index] << endl;
}
- 使用成員函數(shù)
at();
// 獲取索引為 2 的元素
cout << integers.at(2);cout << integers.at(index);
at() 函數(shù)在運行階段檢查容器的大小,如果索引超出邊界(無論如何都不能這樣做),將引發(fā)異常。
- 使用迭代器;
vector <int>::const_iterator element = integers.cbegin ();
7. 使用指針語法訪問 vector 中的元素
vector <int> a (10);
vector <int>::const_iterator element = a.cbegin();
while (element != a.end ())
{size_t index = distance (a.cbegin(), element);cout << "Element at position ";cout << index << " is: " << *element << endl;// move to the next element++ element;
}
std::distance 來計算元素的偏移量(相對于開頭的位置),這是根據(jù) cbegin() 和指向元素的迭代器計算得到的。
8. 刪除 vector 中的元素
除支持使用 push_back() 函數(shù)在末尾插入元素外, vector 還支持使用 pop_back() 函數(shù)將末尾的元素刪除。使用 pop_back() 將元素從 vector 中刪除所需的時間是固定的,即不隨 vector 存儲的元素個數(shù)而異。
vector <int> a (10);
a.pop_back(); // 刪除最后一個元素
9. 大小與容量的區(qū)別
vector 的大小指的是實際存儲的元素數(shù),而 vector 的容量指的是在重新分配內(nèi)存以存儲更多元素前 vector 能夠存儲的元素數(shù)。因此, vector 的大小小于或等于容量。
- 要查詢
vector當前存儲的元素數(shù),可調(diào)用size():
cout << "Size: " << integers.size ();
- 要查詢
vector的容量,可調(diào)用capacity():
cout << "Capacity: " << integers.capacity () << endl;
10. 清空 vector 元素
要清空 vector 和 deque 等 STL 容器,即刪除其包含的所有元素,可使用函數(shù) clear() 。
integers.clear();
vector 和 deque 還包含成員函數(shù) empty() ,這個函數(shù)在容器為空時返回 true ,而不像 clear() 那樣刪除既有的元素。
intDeque.clear();
if (intDeque.empty())
{cout << "The container is now empty" << endl;
}
總結(jié)
以上是生活随笔為你收集整理的C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “置琴曲几上”下一句是什么
- 下一篇: 2022-2028年中国服务机器人行业市