在C++中,如何编写一个函数以便它可以处理任何数据类型?

use*_*888 4 c++ iterator stl

我正在使用此资源学习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)

如何编写类似的函数,以便它们也可以在迭代器上工作?

Bar*_*icz 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

哪里BidirIt是一个概念,一个的双向迭代器类型.标准库容器的迭代器和原始指针都满足它,这就是它工作的原因.

  • @ user2916888除了已在此处发布的内容外,您还可以查看http://en.cppreference.com/w/cpp/algorithm/iter_swap#Possible_implementation.我相信这会让事情变得清晰. (2认同)