1. 程式人生 > 實用技巧 >10_泛型程式設計與STL

10_泛型程式設計與STL

泛型程式和STL

STL元件

  • 容器:儲存元素的物件

  • 迭代器:泛化後的指標

  • 介面卡:stack, queue,

  • 函式物件:泛化的函式

  • 演算法:函式物件作為演算法的引數

迭代器

演算法和容器的橋樑,使得演算法和容器獨立

  • istream_iterator 輸入流迭代器
  • ostream_iterator 輸出流迭代器
  • 前向迭代器
  • 雙向迭代器
  • 隨機訪問迭代器

迭代器的區間

  • [p1, p2) 左閉右開;一般以迭代器的區間作為演算法的輸入
  • advance(p, n) n次遞增
  • distance(first, last) 兩個迭代器距離
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

template <class T, class InputIterator, class OutputIterator>
void mySort(InputIterator first, InputIterator last, OutputIterator result)
{
    vector<int> s;
    for (;first!=last;first++)
    {
        s.push_back(*first);
    }
    sort(s.begin(), s.end());   //隨機訪問迭代器
    copy(s.begin(), s.end(), result);
}

int main() {
    //將s陣列的內容排序後輸出
    double a[5] = { 1.2, 2.4, 0.8, 3.3, 3.2 };
    mySort<double>(a, a + 5, ostream_iterator<double>(cout, " "));
    cout << endl;
    //從標準輸入讀入若干個整數,將排序後的結果輸出
    mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout, " "));
    cout << endl;
    return 0;
}

容器

  • 容器的通用功能

    • 用預設建構函式構造空容器
    • 支援關係運算符:==、!=、<、<=、>、>=
    • begin()、end():獲得容器首、尾迭代器;end()指向最後一個元素的下一個位置
    • clear():將容器清空
    • empty():判斷容器是否為空
    • size():得到容器元素個數
    • s1.swap(s2):將s1和s2兩容器內容交換
  • 相關資料型別(S表示容器型別)

    • S::iterator:指向容器元素的迭代器型別
    • S::const_iterator:常迭代器型別
  • STL為每個可逆容器都提供了逆向迭代器,逆向迭代器可以通過下面的成員函式得到:

    • rbegin() :指向容器尾的逆向迭代器
    • rend():指向容器首的逆向迭代器
  • 隨機訪問容器支援對容器的元素進行隨機訪問

    • s[n]:獲得容器s的第n個元素

順序容器

包括vector、雙端佇列