【问题标题】:Is it possible to generalize a function that gets an STL container as parameter?是否可以概括一个将 STL 容器作为参数的函数?
【发布时间】:2013-11-27 23:44:40
【问题描述】:

我不熟悉 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 容器的内部。从现在开始,我该如何继续?

【问题讨论】:

标签: c++ templates stl generic-programming


【解决方案1】:

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

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&lt;iterator&gt;::value_type 消除该特定限制,但后者完全避免了该问题(并在此过程中大大简化了代码)。

【讨论】:

  • @SteveJessop:抱歉——在我真正完成帖子之前意外发布。我认为它现在更全面地涵盖了您的大部分问题。
  • +1 用于提及 C++11。这确实是一个简洁的答案。谢谢@JerryCoffin。
  • main.cpp:31:10: error: ‘begin’ is not a member of ‘std’ copy(std::begin(c), end(c), 正常吗?我是否需要为begin()end() 包含一个特定的库?
  • @Volkanİlbeyli:听起来您使用的是较旧的 (Pre-C++11) 编译器(或者至少是较旧的库,无论如何)。请改用c.begin()c.end()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多