我正在使用此资源学习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;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它适用于系统定义的类型数组,例如:
int arr[]={1,2,3,4,5}
reversearr(arr,arr+5);
Run Code Online (Sandbox Code Playgroud)
但它给出了以下编译器错误:
"Iterator02_ReverseIterators.cpp:39:32:错误:没有匹配函数来调用'reversearr(std :: vector :: iterator,std :: vector :: iterator)'"
如果我使用此代码:
vector<int> v;
//Code to insert data in vector
reversearr(v.begin(),v.end());
Run Code Online (Sandbox Code Playgroud)
如何编写类似的函数,以便它们也可以在迭代器上工作?
Welp,cppreference.com再次为我们提供了完整的答案,也称为std::reverse:
可能的实施:
template<class BidirIt>
void reverse(BidirIt first, BidirIt last)
{
while ((first != last) && (first != --last)) {
std::iter_swap(first++, last);
}
}
Run Code Online (Sandbox Code Playgroud)
哪里BidirIt是一个概念,一个的双向迭代器类型.标准库容器的迭代器和原始指针都满足它,这就是它工作的原因.
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |