是否可以推广一个函数,将STL容器作为参数

Is it possible to generalize a function that gets an STL container as parameter?

本文关键字:STL 参数 函数 一个 是否      更新时间:2023-10-16

我是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容器的内部。从这一点开始我该怎么做?

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

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来消除这个特定的限制,但后者完全避免了这个问题(并在这个过程中大大简化了代码)。