函数是否可以接受iterator和reverse_iterator作为参数

时间:2016-07-05 03:06:13

标签: c++ templates stl iterator

下面的代码在第二次函数调用中给出了错误。如何让我的函数同时接受iteratorreverse_iterator作为参数,而不是使用参数类型创建第二个函数,例如vector<int>::reverse_iterator

#include <bits/stdc++.h>
using namespace std;

void traverse(vector<int>::iterator begin, vector<int>::iterator end, vector<int>::iterator sbegin, vector<int>::iterator send, string::iterator abegin, string::iterator aend) {
    int last = -1;
    auto i=begin;auto j=sbegin;auto k=abegin; 
    for(; i<end,j<send,k<aend ; i++,j++,k++){
        if(*k=='1') {
            last = *i;
            *j = 0;
        }
        else {
            if(last==-1) continue;
            int min_length = *i-last;
            *j = min({ *j,min_length });
            last = *i;
        }
    }
}

int main() {
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        string available;
        cin >> available;
        vector<int> coordinates(n);
        for (int i = 0; i < n; ++i)
            cin >> coordinates[i];
        vector<int> shortest(n,INT_MAX);
        traverse(coordinates.begin(), coordinates.end(), shortest.begin(), shortest.end(), available.begin(), available.end());
        traverse(coordinates.rbegin(), coordinates.rend(), shortest.rbegin(), shortest.rend(), available.rbegin(), available.rend());
        int sum = 0;
        for(int elem: shortest)
            sum+=elem;
        cout << sum << endl;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:4)

  

如何使我的函数接受iterator和reverse_iterator作为参数

不,他们根本就是不同的类型。您可以创建一个功能模板,如:

template <typename I1, typename I2>
void traverse(I1 begin, I1 end, I1 sbegin, I1 send, I2 abegin, I2 aend) {
    ...
}

BTW:参数名称beginendstd::beginstd::end混淆。您可能想要更改它们。