Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于多个容器和数据类型的模板函数_C++_Templates_Stl_C++11 - Fatal编程技术网

C++ 用于多个容器和数据类型的模板函数

C++ 用于多个容器和数据类型的模板函数,c++,templates,stl,c++11,C++,Templates,Stl,C++11,我想创建一个模板函数,我可以使用不同的容器类型,如vector、deque或list,我可以使用不同的数据类型(整数、double或string)调用它,我搜索过但找不到答案,我尝试过这样做,但出现了错误: #include <iostream> #include <vector> #include <list> #include <deque> #include <iterator> #include <string>

我想创建一个模板函数,我可以使用不同的容器类型,如vector、deque或list,我可以使用不同的数据类型(整数、double或string)调用它,我搜索过但找不到答案,我尝试过这样做,但出现了错误:

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <iterator>
#include <string>

using namespace std;
template <typename C>
void printvec(const C& numbers1)
//void printvec(container C<typename C::valuetype T>)
{
    //C &numbers1;
    for(auto i=0; i < numbers1.size(); ++i)
        cout<<&numbers1<<endl;
    //typename C<A>::iterator itr;
    //for ( itr=numbers1.begin();itr != numbers1.end(); ++itr)
      //  cout<<*itr<<endl;
}

int main()
{
    vector<int> vint{2,4,6,8,9,3};
    vector<double> vdouble{5.8, 6.7, 7.3};
    vector<string> vstring {"alex", "bbb", "cccc"};
    list<int> ls{1,2,3,4,5};
    printvec(vint );
    printvec(vdouble);
    printvec(vstring);
    printvec(ls);
        return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
模板
无效打印向量(常量C和编号1)
//无效打印向量(容器C)
{
//C&numbers1;
对于(自动i=0;i不需要用它来创建函数,标准库已经有了实现这一点所需的所有工具:

 std::copy(vec.begin(),vec.end(),
     std::ostream_iterator(cout,"\n"));

如果您可以使用C++11,请使用
std::begin(vec)
而不是
vec.begin()
end
-正如@AndyProwl正确指出的那样,它更一般。

这就是为什么标准库有这样的算法。你传递一个开始和结束迭代器,而不是容器本身。作为第三个参数传递的模板函数负责这项工作。

如果你真的需要的话编写自己的函数,在通用容器上进行迭代,这可能是处理任何标准容器的最简单方法:

template <typename C>
void print(const C& c)
{
    for (auto const& e : c) 
    { 
        cout << e << endl; 
    }
}
模板
无效打印(常量C&C)
{
用于(自动施工与设备:c)
{ 

cout其他人已经指出了为什么你应该使用库函数,为什么你要重新发明轮子。如果你想这样做,下面是你应该如何编写它

容器不是用抽象基类来指定的,而是一个通用接口,它指定了语法结构所需的语法和预期的语义(这些东西称为概念)。最通用的是,更专门的是。如果接受
SequenceContainer
作为模板参数,则必须将使用模板参数的代码约束到这些要求。在您的情况下:

template<typename SequenceContainer>
void print(const SequenceContainer& seq)
{
  // being able to use range-for loops 
  // is a consequence of being a SequenceContainer
  for(auto& i : seq) {
    std::cout << i << " ";
  }
  std::cout << std::endl;

  // alternatively
  using std::begin; // enable ADL fallback for arrays
  using std::end;
  for(auto it = begin(seq); it != end(seq); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;
}
模板
无效打印(const SequenceContainer和seq)
{
//能够使用循环的范围
//是作为SequenceContainer的结果
用于(自动和仪表:序号){

std::cout可能有帮助,我建议使用
begin(vec)
end(vec)
而不是成员函数,这样它也可以在C样式的数组上工作