传递一个std容器的功能
我想出了以下内容:传递一个std容器的功能
template <typename T> inline void printcontainer(std::vector<T> container)
{
for(auto it = container.begin(); it != container.end(); it++)
{
std::cout << *it << std::endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> v;
v.push_back(5);
v.push_back(4);
v.push_back(3);
printcontainer(v);
return 0;
}
(对不起,我push_backs
,视觉工作室不接受初始化列表...啊!!)
现在这个函数被限制为std::vector
,我怎样才能让它可以通过其他的容器,比如std::list
数组等等......
只是不要在容器存储的类型上模板,而是在类型上容器本身:
template <typename Container>
inline void printcontainer(const Container &container)
请注意,我将参数更改为const
引用以避免不必要的副本。
您可以通过使用非成员std::begin
和std::end
或使用range based for
loop概括您的打印功能C数组:
template <typename Container>
inline void printcontainer(const Container &container) {
for (const auto &v : container)
std::cout << v << "\n";
}
OT备注:您可能不需要inline
这里。
哇我对(const auto&v:container)''印象深刻'这叫做怎么样?我会研究它 –
[基于范围的循环(自C++ 11以来)](http://en.cppreference.com/w/cpp/language/range-for) – Drop
tyvm,我会接受这个答案尽快允许! –
传递容器对象是对付经典Stepanov的STL 容器迭代器算法泛型编程风格。
一般人会通过迭代器:
# define ForwardIterator typename // workaround untill we have concepts
template <ForwardIterator It> inline void printcontainer(It begin, It end)
{
for(;begin != end; ++begin)
{
std::cout << *begin << std::endl;
}
}
用法:
std::vector<int> v = {1, 2, 3, 4};
printcontainer(v.cbegin(), v.cend());
++您正在使用什么版本的VC不支持初始化列表? – MikeMB
visual studio 2012,像'std :: vector v {1,2,3};'这样的东西不被支持,所以你必须使用我非常鄙视的c样式数组解决方法。它也没有'std :: initializer_list'很奇怪的呃。 –
对,我已经习惯了C++ 11,我忘了VS采用了很多/最? C++ 11功能不在VS 2013之前。 – MikeMB