我正在使用此资源学习C ++ STL:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=standardTemplateLibrary
在那里给出了以下函数来反转数组的元素:
template<typename T> void reversearr(T *begin, T *end) {
// We should at first decrement 'end'
// But only for non-empty range
if(begin != end)
{
end--;
if(begin != end) {
while(true) {
swap(*begin, *end);
begin++;
if(begin == end) {
break;
}
end--;
if(begin == end) {
break;
}
}
}
}
}
它适用于系统定义的类型数组,例如:
int arr[]={1,2,3,4,5}
reversearr(arr,arr+5);
但它给出了以下编译器错误:
&#34; Iterator02_ReverseIterators.cpp:39:32:错误:没有匹配函数来调用&#39; reversearr(std :: vector :: iterator,std :: vector :: iterator)&#39;& #34;
如果我使用此代码:
vector<int> v;
//Code to insert data in vector
reversearr(v.begin(),v.end());
如何编写类似的函数,以便它们也可以在迭代器上工作?
答案 0 :(得分:7)
Welp,cppreference.com再次为我们提供了完整的答案,也称为std::reverse
:
可能的实施:
template<class BidirIt>
void reverse(BidirIt first, BidirIt last)
{
while ((first != last) && (first != --last)) {
std::iter_swap(first++, last);
}
}
其中BidirIt
是bidirectional iterator类型的概念。两个标准库容器&#39;迭代器和原始指针满足它,这就是它起作用的原因。
答案 1 :(得分:4)
在您的代码中,参数是T
的指针。当你使用迭代器时,参数是指向迭代器的指针,所以它不起作用。
如果你想让它与迭代器一起工作,我认为你应该这样写:
template<typename T>
void reversearr(T begin, T end)
{
...
}
答案 2 :(得分:4)
这是一个有趣的事实:
即使从参数中删除*
,您的代码也可以使用数组。
template<typename T> void reversearr(T begin, T end) {
为什么?
因为在原始代码中,T
为int
,而且T*
的函数参数为int*
。
在我修改过的代码中,T
为int*
,函数参数仍为 int*
。
这个&#34;版本&#34;与迭代器一起工作 - 选择迭代器的语法和语义,这样你就可以编写与指针或迭代器同样有效的泛型函数。