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

时间:2013-11-27 23:44:41

标签: 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;
}

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

1 个答案:

答案 0 :(得分:5)

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

std::copy(v.begin(), v.end(), std::ostream_iterator<T>(std::cout, "\n"));

因此,我会继续使用已有的东西。如果你真的喜欢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"));
}

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

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

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