天天看點

泛型程式設計與STL 第十五章Function Object Classes(函數對象類)

作者:明政面朝大海春暖花開

泛型程式設計是一種程式設計範式,它的目标是編寫可重用的、通用的代碼,以處理多種資料類型,而不僅僅是特定的資料類型。STL(标準模闆庫)是C++中的一個重要組成部分,它提供了一組通用的資料結構和算法,用于處理不同類型的資料。

在STL中,有幾種與疊代器相關的重要概念和類,包括插入疊代器(Insert Iterators)、流疊代器(Stream Iterators)、反向疊代器(reverse_iterator)和原始存儲疊代器(raw_storage_iterator)。下面是對它們的簡要介紹和C++示例:

  1. 插入疊代器(Insert Iterators):插入疊代器用于向容器中插入元素。它們提供了一種通用的接口,使得可以使用類似于指派操作符的方式将元素插入到容器中。常見的插入疊代器有back_inserter、front_inserter和inserter。例如:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main() {
    std::vector<int> vec;
    std::back_insert_iterator<std::vector<int>> backInserter(vec);

    *backInserter = 1;
    *backInserter = 2;
    *backInserter = 3;

    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
           

輸出結果為:1 2 3

  1. 流疊代器(Stream Iterators):流疊代器用于将輸入/輸出流(如std::cin和std::cout)與容器關聯起來,以便從流中讀取資料或将資料寫入流中。常見的流疊代器有istream_iterator和ostream_iterator。例如:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main() {
    std::vector<int> vec;
    std::istream_iterator<int> inputIterator(std::cin);

    std::copy(inputIterator, std::istream_iterator<int>(), std::back_inserter(vec));

    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
           

通過在控制台輸入一系列整數,并以空格分隔,然後按Enter鍵結束輸入,程式将把這些整數存儲到vec容器中,并将它們輸出到控制台。

  1. 反向疊代器(reverse_iterator):反向疊代器用于反向周遊容器中的元素。它們提供了一種逆序通路容器的方式。例如:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int>::reverse_iterator reverseIter;

    for (reverseIter = vec.rbegin(); reverseIter != vec.rend(); ++reverseIter) {
        std::cout << *reverseIter << " ";
    }

    return 0;
}
           

輸出結果為:5 4 3 2 1

  1. 原始存儲疊代器(raw_storage_iterator):原始存儲疊代器用于在未初始化的記憶體區域中構造對象。它們提供了一種構造對象的方式,而不需要進行複制或移動操作。原始存儲疊代器通常與低級記憶體操作一起使用。這裡沒有給出具體的示例,因為使用原始存儲疊代器需要更深入的了解和謹慎操作。

這些疊代器是STL中的重要組成部分,它們使得泛型程式設計更加靈活和通用。希望這些示例能夠幫助你了解泛型程式設計和STL中的疊代器概念。

泛型程式設計是一種程式設計範式,它強調使用通用的算法和資料結構來實作可重用的代碼。在C++中,泛型程式設計的一個重要組成部分是STL(Standard Template Library,标準模闆庫)。

STL是C++标準庫的一部分,提供了一組通用的模闆類和函數,用于實作常見的資料結構和算法。STL的設計基于泛型程式設計思想,通過使用模闆來實作代碼的通用性和重用性。

在STL中,有許多與函數對象(Function Object)相關的類和函數。函數對象是可以像函數一樣被調用的對象,它們通常被用作算法的參數,用于指定特定的操作或行為。下面是一些與函數對象相關的基類和特殊類:

  1. Function Object Base Classes(函數對象基類):STL提供了一些基類,如std::unary_function和std::binary_function,用于派生自定義的函數對象類。
  2. 算術運算(Arithmetic Operations):STL提供了一些函數對象類,如std::plus、std::minus、std::multiplies等,用于執行加法、減法、乘法等算術運算。
  3. 大小比較(Comparison Operations):STL提供了一些函數對象類,如std::less、std::greater、std::equal_to等,用于執行大小比較操作。
  4. 邏輯運算(Logical Operations):STL提供了一些函數對象類,如std::logical_and、std::logical_or、std::logical_not等,用于執行邏輯運算。
  5. 證同與投射(Identity and Projection):STL提供了一些函數對象類,如std::identity、std::select1st、std::select2nd等,用于執行證同和投射操作。
  6. 特殊的Function Objects(特殊的函數對象):STL還提供了一些特殊的函數對象,如std::bind1st、std::bind2nd、std::mem_fun、std::mem_fun_ref等,用于實作特定的功能或擴充卡。
  7. Member Function Adapters(成員函數擴充卡):STL提供了一些成員函數擴充卡,如std::mem_fun、std::mem_fun_ref、std::mem_fun1、std::mem_fun1_ref等,用于将成員函數轉換為函數對象。
  8. 其他的Adapters(其他擴充卡):STL還提供了一些其他的擴充卡,如std::not1、std::not2、std::compose等,用于組合和轉換函數對象。

下面是一個簡單的C++代碼示例,展示了如何使用STL中的函數對象和算法:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    
    // 使用std::transform算法和std::plus函數對象執行加法操作
    std::transform(numbers.begin(), numbers.end(), numbers.begin(), std::bind2nd(std::plus<int>(), 10));
    
    // 輸出加法後的結果
    for (int num : numbers) {
        std::cout << num << " ";
    }
    
    return 0;
}
           

在上面的示例中,我們使用了std::transform算法和std::plus函數對象來執行加法操作。通過std::bind2nd函數擴充卡,我們将std::plus函數對象的第二個參數綁定為10,然後将其作為std::transform算法的操作參數,實作了對vector中所有元素進行加法操作的功能。

繼續閱讀