函数可以同时接受迭代器和反向迭代器作为参数吗

Shu*_*ain 4 c++ templates iterator stl

下面的代码在第二个函数调用中给了我错误。如何使我的函数接受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;
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

如何使我的函数接受迭代器和反向迭代器作为参数

不,它们根本就是不同的类型。您可以制作一个函数模板,例如:

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

BTW:参数名称beginand与andend混淆。您可能想更改它们。std::beginstd::end