是否可以推广一个函数,将STL容器作为参数
Is it possible to generalize a function that gets an STL container as parameter?
我是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
来消除这个特定的限制,但后者完全避免了这个问题(并在这个过程中大大简化了代码)。
相关文章:
- 有没有办法捕获 STL 函数未被赋予正确参数的异常?
- C++ 如何将参数传递给 STL 函数
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- 作为 Stl 容器参数的模板类
- STL 容器在函数中作为模板参数,在调用中出错
- 可以在 stl 容器上完成非类型模板参数吗?
- STL vector.insert 方法期望_InputIterator作为参数
- 模板化函数以从输入参数推断返回类型 stl-container
- IS C STL模板参数足够精确
- 如何断言模板参数的类型 STL 迭代器类型
- 为什么lambda函数用于stl函数,例如sort(),c 中的max_element()函数以两个参数为输入
- 意外参数通过使用STL数字的顺序
- 无法使用 std::function 作为参数类型(需要函数指针版本)宁愿像 STL 这样的模板,但随后它无法推断参数
- STL 按多个参数C++排序
- 模板参数适用于不同的STL容器
- 在SGI STL的实现中,向量的push_back函数不使用默认参数
- C++模板编程/STL 推导参数
- 将适当类型的迭代器作为参数返回适当类型的STL容器
- 如何将函数中的stl列表传递为C 中的参数
- 从共享库调用带有STL参数的函数