重载放置运算符 (<<),用于递归打印出数组的元素C++

Overload put operator (<<) to recursively print out elements of an array in C++

本文关键字:lt 打印 数组 C++ 元素 递归 运算符 重载 用于      更新时间:2023-10-16

我正在尝试编写代码,以递归地打印出使用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中除第一个元素以外的所有元素