【问题标题】:How to recursively print the contents of a vector in C++如何在 C++ 中递归打印向量的内容
【发布时间】:2021-05-12 13:05:24
【问题描述】:

我想要一个函数,它接收 template 为 std::vector 并打印向量中的任何内容,前提是它是 std::cout 中允许的数据类型。我相信这需要递归,因为 vector of vector of a vector...。例如,给定一维vector,

template< typename T>
void PrintVector(T vec)
{
   for (unsigned int i = 0; i < vec.size(); i++){
       std::cout << vec[i] << std::endl;
   }
}

这段代码有一些问题。

1. 如果它是一个多维向量,这不起作用,我需要它(我猜这个语句:vec[i])递归地打印出该向量并执行如果有另一个向量,则相同。

2. 我还希望它引用模板中的矢量,因此我不会复制 1gb 大小的 3d 矢量来打印它,而只是引用所以我不要为此分配任何内存。

任何帮助将不胜感激!

【问题讨论】:

  • 关于 2.:有什么问题?是什么阻止你参考它?
  • @bolov 我不知道怎么做。另外另一个问题是我什至不确定该语法是否正确。我需要它来接收std::vector&lt; TEMPLATE &gt; 而不是模板。
  • 那么是时候从good c++ book开始了
  • 我刚刚注意到您编辑了您的帖子以提出一个完全不同的问题。不要那样做!而是提出一个新问题。
  • @bolov 我不能。已达到我的问题限制

标签: c++ recursion vector


【解决方案1】:

首先让我们澄清一些事情:std::vector 是一个模板,但std::vector&lt;T&gt; 是一个类(从模板生成,但这无关紧要)。 std::vector&lt;T&gt; 中的 T 也是类型而不是模板。

我还希望它引用模板中的向量

它不是那样工作的。您只需将函数参数设为引用即可。

回到您的主要问题。一种常见的方法是使用重载函数:

template <class T>
void print(const T& obj)
{
    std::cout << obj;
}

template <class T>
void print(const std::vector<T>& v)
{
    for (const auto& elem : v)
    {
        print(elem);
        std::cout << std::endl;
    }
}

当您使用std::vector&lt;std::vector&lt;int&gt;&gt; 调用print 时,会选择第二个重载,因为它匹配并且比第一个重载更专业。 T 推导出为std::vector&lt;int&gt;; print(elem) 调用第二个重载,T 推导出为 int,这里 print(elem) 调用第一个重载。

【讨论】:

  • 所以它递归地打印向量但具有不同的同名重载函数?另外,如果您不使用 auto,您会用什么类型替换 elem?我只是想知道是否说我想用计数器做一个传统的 for 循环
  • for (std::size_t i = 0; i &lt; v.size(); ++i) { print(v[i]); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多