简体   繁体   English

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

[英]Can a function accept both iterator and reverse_iterator as parameter

The code below is giving me error in the second function call. 下面的代码在第二个函数调用中给出了错误。 How can I make my function accept both iterator and reverse_iterator as parameter, rather than making a second function with parameter type such as vector<int>::reverse_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;
}

How can I make my function accept both iterator and reverse_iterator as parameter 如何使我的函数接受iterator和reverse_iterator作为参数

No, they're different types at all. 不,他们是完全不同的类型。 You can make a function template like: 您可以创建一个功能模板,如:

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

BTW: The parameter name begin and end is confused with std::begin and std::end . BTW:参数名称beginendstd::beginstd::end混淆。 You might want to change them. 您可能想要更改它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM