首頁 > 軟體

C++STL之vector模板類詳解

2022-03-14 13:01:21

前言

STL標準模板庫是C++中非常有用的功能庫。本篇從vector容器開始學習STL。

vector模板類

建立vector物件,遍歷元素

vector模板類在標頭檔案vector中,用於儲存陣列,並採用動態記憶體分配。

建立一個vector物件並初始化長度,通過[]運運算元存取元素:

#include <vector>
using namespace std;
int main(){
    vector<int> vec(5); // vec length 5
    vec[0] = 1;
    return 1;
}

可以採用for迴圈遍歷vector元素,C++11提供了採用範圍for迴圈來遍歷STL容器:

for(int i=0; i < 5; i++) // general
	cout << vec[i] << 'n';
// equal to
for(int i: vec) // range
	cout << i << 'n';

迭代器

迭代器是STL中,類似指標的類,指向容器中的某個元素。

建立一個正向迭代器:

vector<int>::iterator t;
t = vec.begin();
*t = 1; // vec[0] = 1
t++; // vec[1]

迭代器就像一個指標,具有*++運運算元。

容器的基本方法

STL容器都提供了一些基本方法,包括:

  • size():返回容器中的元素數目
  • swap():交換兩個容器的內容
  • begin():返回一個指向容器中第一個元素的迭代器
  • end():返回一個指向容器末尾元素後一個元素的迭代器

此外,vector還包含一些部分容器擁有的方法:

  • push_back():在容器末尾新增一個元素
  • pop_back():刪除容器末尾的元素
  • erase():給定一個迭代器,刪除該迭代器指向的元素;給定兩個迭代器it1, it2,刪除容器內區間[it1, it2)的元素
  • insert():給定一個迭代器和一個元素,在該迭代器指向處插入該元素;給定三個迭代器it1, it2, it3,將容器區間[it2, it3)的元素插入到it1處。
  • clear():清除容器中所有元素

此外還有一些有用的方法,以後碰上再總結。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

int main(){
    vector<int> vec(5);
    vector<int> copyvec(vec);
    for(int i: vec)
        cout << i <<'n';
    cout <<'n';
    vector<int>::iterator t;
    t = vec.begin();
    *t = 1;
    for(int i: vec)
        cout << i <<'n';
    cout << 'n';
    cout << vec.size() << endl;
    cout << 'n';
    vec.swap(copyvec);
    for(int i: vec)
        cout << i <<'n';
    cout <<'n';
    vec.insert(vec.end(), copyvec.begin(), copyvec.end());
    for(int i: vec)
        cout << i <<'n';
    cout <<'n';
    vec.erase(vec.begin(), (vec.begin()+5));
    for(int i: vec)
        cout << i <<'n';
    cout <<'n';
    vec.push_back(2);
    for(int i: vec)
        cout << i <<'n';
    cout <<'n';
    vec.pop_back();
    for(int i: vec)
        cout << i <<'n';
    cout <<'n';
    vec.clear();
    std::cout << vec.size() <<endl;
    cout << 'n';
    return 1;
}

STL函數,sort

STL通過泛型程式設計的思想定義了很多STL函數,用於各種容器類的通用操作,如搜尋,排序等。

標頭檔案algorithm提供了這些STL函數,以sort排序為例,sort函數引數為前後兩個迭代器以及一個比較方法:
template <typename Iter> void sort (Iter first, Iter last, Compare comp);比較區間為[first, last),comp表示函數指標:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    vector<int> vec;
    vec.push_back(2);
    vec.push_back(4);
    vec.push_back(1);
    for(int i: vec)
        cout << i <<'n';
    cout <<'n';
    sort(vec.begin(), vec.end());
    for(int i: vec)
        cout << i <<'n';
    cout <<'n';
    return 1;
}
/*
2 n 4 n 1
1 n 2 n 4
*/

如果不提供比較方法,則預設使用容器元素定義的<進行比較;如果提供Compare函數指標,則根據返回的true, false進行排序,true表示Compare引數順序正確:

bool smaller(const int& a, const int& b){
    if(a >= b)
        return true;
    return false;
}
sort(vec.begin(), vec.end(), smaller);
// 4 2 1

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!       


IT145.com E-mail:sddin#qq.com