下面的代码在第二次函数调用中给出了错误。如何让我的函数同时接受iterator
和reverse_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;
}
答案 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:参数名称begin
和end
与std::begin
和std::end
混淆。您可能想要更改它们。