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

标签 c++ templates stl generic-programming

我是 C++ 泛型函数的新手。我有一个打印 vector 内部的模板函数。

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 删除该特定限制。如果你非常想要,但后者完全避免了这个问题(并在此过程中大大简化了代码)。

关于c++ - 是否可以概括一个将 STL 容器作为参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20255296/

相关文章:

c++ - long long 和 long 和有什么不一样

c++ - SDL_Texture - 不完整类型

c++ - 推导 Lambda 捕获类型

c++ - 如何在STL中使用xtree调用一个简单的红黑树?

c++ - 为什么 STL 使用赋值运算符在容器中移动项目?

c++ - 为什么 opengl 着色器没有编译?

c++ - 带模板的条件返回类型

templates - Gradle复制任务扩展yaml文件转义整个字符串

C++ 模板 - 具有模板化类型的通用方法

c++ - STL迭代器包装器