2016-01-01 57 views
7

我想出了以下内容:传递一个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数组等等......

+0

++您正在使用什么版本的VC不支持初始化列表? – MikeMB

+0

visual studio 2012,像'std :: vector v {1,2,3};'这样的东西不被支持,所以你必须使用我非常鄙视的c样式数组解决方法。它也没有'std :: initializer_list'很奇怪的呃。 –

+0

对,我已经习惯了C++ 11,我忘了VS采用了很多/最? C++ 11功能不在VS 2013之前。 – MikeMB

回答

7

只是不要在容器存储的类型上模板,而是在类型上容器本身:

template <typename Container> 
inline void printcontainer(const Container &container) 

请注意,我将参数更改为const引用以避免不必要的副本。

您可以通过使用非成员std::beginstd::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这里。

+0

哇我对(const auto&v:container)''印象深刻'这叫做怎么样?我会研究它 –

+2

[基于范围的循环(自C++ 11以来)](http://en.cppreference.com/w/cpp/language/range-for) – Drop

+0

tyvm,我会接受这个答案尽快允许! –

2

传递容器对象是对付经典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()); 
+0

*“您正试图在C++文件中编写Java。”*如何?我看到在这里通过容器没有问题。事实上,boost在标准库中提供了许多基于迭代器的函数的容器版本,以减少冗长。 (不是我的DV btw。) –

+0

@BaummitAugen好吧,它有点太多,我会删除这个短语;) – Drop

+1

虽然这名义上似乎确定,这个宏只是丑陋的,值得自己downvote所有。此外,螺旋迭代器,范围是未来。 – Puppy