是否可以概括一个将STL容器作为参数的函数?

Var*_*lex 1 c++ templates stl generic-programming

我是C++中泛型函数的新手.我有一个模板功能,可以打印矢量的内部.

template<class T>
void print(vector<T> v){
    for(typename vector<T>::iterator it=v.begin(); it != v.end() ; it++)
        cout << *it << endl;
}
Run Code Online (Sandbox Code Playgroud)

我想写一个更通用print()的打印STL容器的内部.我怎么能从这一点开始呢?

Jer*_*fin 5

已经有一个通用算法可以做到这一点,使用输入和输出的迭代器:

std::copy(v.begin(), v.end(), std::ostream_iterator<T>(std::cout, "\n"));
Run Code Online (Sandbox Code Playgroud)

因此,我将继续使用已有的东西.如果你真的喜欢print(container_name);(我承认它很有吸引力)的语法,你可以使用它作为实现,如下所示:

template <class Container>
void print(Container const &c) { 
    std::copy(std::begin(c), std::end(c),
              std::ostream_iterator<typename Container::value_type>(std::cout, "\n"));
}
Run Code Online (Sandbox Code Playgroud)

我注意到(在C++ 11中)使用基于范围的for循环通常比使用它更方便std::copy:

template <class Container>
void print(Container const &c) { 
    for (auto const &item : c)
        std::cout << item << "\n";
}
Run Code Online (Sandbox Code Playgroud)

这些都应该适用于大多数真正的容器,不过我通常更喜欢后者,不仅因为它更简单,而且因为它更通用.第一个需要一个实际的容器来定义一个value_type成员,所以你不能将它应用于内置数组,例如.您可以通过使用来删除该特定限制,std::iterator_traits<iterator>::value_type如果您想要足够严重,但后者完全避免了问题(并在过程中简化了相当多的代码).