STL典型使用--vector類模板
阿新 • • 發佈:2018-12-11
vector是將元素放在一個動態陣列中加以管理的容器,vector可以隨機存取元素(用[]操作符或at()直接存取),也支援迭代器存取元素;vector在尾部新增或移除元素十分高效,但是在中間或者頭部插入/移除元素會比較費時。
1. 增加/刪除vector內的元素
vector採用類模板實現,從而實現了演算法和資料型別的分離,因此vector可以存放任何型別的元素(一個vector裡的元素只能是一種):
vector<int> intVec; //一個存放int的vector容器 class TT {}; vector<TT> vecTT; //一個存放TT物件的vector容器 vector<TT*> vecTTAddr; //一個存放TT物件地址的vector容器
需要注意,容器元素存放是按值複製的方式進行的,所以TT類必須提高TT的拷貝建構函式,以保證TT物件間拷貝正常。
示例1:
std::vector<int> intVec; for (int i = 0; i < 5; ++i) { intVec.push_back(i + 1); //尾插元素值 } intVec.front() = 128; //修改頭部資料,front()返回的是頭部元素的引用 intVec.back() = 666; //修改尾部資料,back()返回的是尾部元素的引用 while (intVec.size() > 0) { std::cout << intVec.back() << std::endl; intVec.pop_back(); //刪除尾部元素 }
vector有如下帶參建構函式:
vector(beg, end); //建構函式將[beg, end)區間中的元素拷貝給本身。注意該區間是左閉右開區間
vector(n, elem); //建構函式將n個elem拷貝給本身
vector(const vector& vec); //拷貝建構函式
int arr[] = {0, 1, 2, 3, 4}; std::vector<int> int_vec1(arr, arr + 5); std::vector<int> int_vec2(int_vec1.begin(),int_vec1.end()); std::vector<int> int_vec3(int_vec1.begin(), int_vec1.begin() + 3); std::vector<int> int_vec4(3, 9); std::vector<int> int_vec5 = int_vec1;
2. vector的[]的下標操作符
需要注意,進行[]操作之前要保證該地址已分配記憶體。
示例1:
std::vector<int> v1(10); //分配10個int的空間,其初始值為0
for (int i = 0; i < 10; ++i) {
v1[i] = i * 2;
}
for (int i = 0; i < 10; ++i) {
printf("%d\n", v1[1]);
}
3. vector的迭代器
迭代器是一個可遍歷STL容器內全部或者部分元素的物件,它如同一個指標,指出容器中的一個特定位置。迭代器提供對容器中的物件的訪問方法,並且可以定義了容器中物件的範圍。
示例:
//正序遍歷
for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ++it) {
std::cout << *it << std::endl;
}
//逆序遍歷,.rbegin()等價於.end()
for (std::vector<int>::reverse_iterator rit = v1.rbegin(); rit != v1.rend(); ++rit) {
std::cout << *rit << std::endl;
}
迭代器由只讀/非只讀、正序/逆序組合如下4種:
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector> const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
4. vector的插入和刪除
v1.clear(); //移除容器中所有資料
v1.erase(v1.begin(), v1.end()); //刪除[begin(), end())區間的資料,返回下一個資料的位置
v1.erase(pos); //刪除pos位置的資料,返回下一個資料的位置
示例:
for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ) {
if (*it == 6) {
it = v1.erator(it); //刪除迭代器所指的元素時,該函式會自加it並且返回,所以for()迴圈中不能++it
}
else {
++it;
}
}
元素插入:
v1.insert(pos, elem); //在pos位置插入一個elem元素的拷貝,返回新資料的位置
v1.insert(pos, n, elem); //在pos位置插入n個elem元素的拷貝,無返回值
v1.insert(pos, begin(), end()); //在pos位置插入[begin(), end())區間的資料,無返回值