2016-07-05 84 views
3

下面的代码在第二个函数调用中给我错误。我怎样才能让我的功能同时接受iteratorreverse_iterator为参数,而不是使第二函数参数类型,如vector<int>::reverse_iterator函数是否可以同时接受iterator和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; 
} 
+0

请稍等片段。 –

+0

我怀疑你的for循环中的*条件不符合你的期望。 – Galik

回答

4

我怎样才能让我的函数接受Iterator和reverse_iterator的作为参数

不,它们根本不同。你可以做一个函数模板,如:

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

BTW:参数名称beginend被混淆std::beginstd::end。你可能想要改变它们。

相关问题