107.02.15 c++ template iterator

今天除夕
祝大家新年快樂啦 OuO

記錄一下把 C++ 中的 vector 函式改成 template
只改 vector 是頗容易,但是加上 iterator 就出現錯誤

原本只能使用 int 當作元素的函式
void print_vector(vector<int> a)
{
    vector<int>::iterator iter;
    for (iter = a.begin(); iter != a.end(); iter++) {
        printf("%d ", *iter);
    }
    printf("\n");
}


修改後:
主要要注意的是 vector::iterator 前面要加上 typename,否則會有錯誤訊息
(missing 'typename' prior to dependent type name 'vector::iterator')
優點:可使用其他型別,e.g. long long, double 或其他有 overriding << 運算子的 class 

缺點:不能用 printf 來輸出元素
template <class T>
void print_vector(vector<T> a)
{
    typename vector<T>::iterator iter;
    for (iter = a.begin(); iter != a.end(); iter++) {
        printf("%s", (iter == a.begin())? "": " ");
        cout << *iter;
    }
    printf("\n");
}


修改後完整程式碼(含測試):
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;

template <class T>
void print_vector(vector<T> a)
{
    typename vector<T>::iterator iter;
    for (iter = a.begin(); iter != a.end(); iter++) {
        printf("%s", (iter == a.begin())? "": " ");
        cout << *iter;
    }
    printf("\n");
}

int main()
{
    vector<double> a({-1, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1});
    print_vector(a);
    return 0;
}


參考資料:
C++ template typename iterator

沒有留言:

張貼留言

^ Top