重载放置运算符 (<<),用于递归打印出数组的元素C++
Overload put operator (<<) to recursively print out elements of an array in C++
我正在尝试编写代码,以递归地打印出使用c++中的重载放置操作符(<<)的数组元素。然而,我只知道如何使用非递归来做到这一点。有人能帮我把这个翻译成递归的吗?我的代码如下,提前感谢。
ostream& operator<< (ostream& outA, Recur a){
for (int i = 0; i < a.aSize; i++){
outA << a.aArray[i] << " ";
}
outA << endl ;
return outA;
}
像这样:
ostream& operator<< (ostream& outA, Recur a) {
if (a.size() > 0) {
outA << a.aArray[0] << " ";
Recur b;
b.aArray = &a.aArray[1];
b.setSize(a.size() - 1);
return outA << b
}
else {
outA << endl;
return outA;
}
}
不知道什么是递归,所以我假设有一个指向数组的指针和一个大小属性。其思想是输出一个元素,然后用较小的数组递归调用。
假设您只指c风格的数组(其中大小是类型定义的一部分),而不是指针,您可以推出以下内容:
#include <iostream>
using namespace std;
template<typename T, size_t N>
ostream& operator<< (ostream& outA, T (& arr)[N]) {
outA << arr[0];
T (&next)[N-1] = reinterpret_cast<T(&)[N-1]>(arr[1]);
outA << next;
return outA;
}
template<typename T>
ostream& operator<< (ostream& outA, T (& arr)[1]) {
outA << arr[0];
return outA;
}
int main() {
int a[] = {1, 2, 3, 4};
cout << a;
return 0;
}
尽管它可以工作,但对于一个非常简单的任务,它具有递归的所有开销。更不用说丑陋的reinterpret_cast
了,这样我就可以把数组的尾部当作一个较小大小的数组……就像NathanOliver说的那样,你需要在递归的每一步都建立一个单独的函数。
最后,我真诚地希望你的问题纯粹是学术性的。
如果您将operator<<
仅用作提取数组大小的包装器,然后调用实际函数,则可以实现一个不那么糟糕的实现。
template<typename T>
void printArr(ostream& outA, T *a, size_t n) {
if (n > 0) {
outA << *a;
printArr(outA, a + 1, n - 1);
}
}
template<typename T, size_t N>
ostream& operator<< (ostream& outA, T (& arr)[N]) {
printArr(outA, arr, N);
return outA;
}
在这个版本中:每次调用只有两个函数实例化,没有难看的类型转换,实际的递归调用看起来像传统的递归调用。
下面是一些伪代码:
ostream& operator<< (ostream& outA, Recur a) {
if(a.isEmpty())
return outA;
outA << a.first();
outA << a.tail();
}
如果有operator<<为单个元素定义。a.tail()表示a中除第一个元素以外的所有元素
相关文章:
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 呼叫运营商<<临时
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 过载输出<<用于类的运算符,以打印其中的元组
- 重载operator< & lt;作为会员打印
- 重载& lt; & lt;用于打印自定义异常的操作符
- 如何显示/打印字符串对象?cout & lt; & lt;Int工作,count <<字符串
- 什么会导致死亡<<变量& lt; & lt;“ t";当输出超过终端宽度时,打印空白而不是值