我想创建一个模板函数,我可以使用不同的容器类型,如vector,deque或list,我可以使用不同的数据类型(整数,双精度或字符串)调用它,我已经搜索但是不能找不到答案,我试过这样做,但我收到了错误:
#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;
}
那么,请问这是什么方法呢?
答案 0 :(得分:3)
没有真正需要制作一个功能,标准库已经拥有了您需要的所有工具:
std::copy(vec.begin(),vec.end(),
std::ostream_iterator(cout,"\n"));
如果您有C ++ 11可供使用,请使用std::begin(vec)
代替vec.begin()
,而end
使用相同内容 - @AndyProwl正确指出它更为通用。
答案 1 :(得分:2)
其他人已经指出了为什么你应该使用库函数以及为什么要重新发明轮子。如果你想这样做,你应该如何编写它。
容器不是根据抽象基类指定的,而是指定语法结构所需语法和预期语义的通用接口(这些被称为概念)。最一般的是Container,更专业的是SequenceContainer。如果接受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;
}
编写好的模板代码不适合胆小的人,所以你可以 我想先考虑更好地理解基本的C ++。
答案 2 :(得分:1)
如果真的需要编写自己的迭代通用容器的函数,那么这可能是适用于任何标准容器的最简单方法:
template <typename C>
void print(const C& c)
{
for (auto const& e : c)
{
cout << e << endl;
}
}
然而,正如us2012正确指出的那样,没有必要重新发明轮子。
答案 3 :(得分:0)
这正是标准库具有for_each等算法的原因。您传递一个起始和结束迭代器而不是容器本身。作为第三个参数传递的模板化函数负责工作。