首页 > 解决方案 > 从下标运算符重载中返回一个数组

问题描述

我开始使用 c++,我有这个方法,我重载下标运算符“[]”,但我需要从该方法返回一个数组,在该方法中,我试图从一个更大的数组返回一个子数组但我似乎无法返回整个数组,因为我只能从数组中返回单个元素,我怎样才能获得返回整个数组的方法?

例如:

int& PagedArray::operator [] (int position){
    if(position == 0){
        for(int i = 0; i < 256; i++){
            pageArray[i] = completeArray[i];
            //cout << to_string(i) + " " + to_string(pageArray[i]) << endl;
        }
        return pageArray[0] ;
    }
}

当我尝试返回时,我只能从数组 pageArray 中获取特定元素,但我需要返回 pageArray,我该如何完成呢?

谢谢

标签: c++arraysoverloadingoperator-keywordsubscript

解决方案


我需要从该方法返回一个数组

int& PagedArray::operator [] (int position)

您为函数提供的返回类型与您需要返回的类型不匹配。这个函数返回一个整数的引用;不是数组。

你需要的一个问题是你不能在 C++ 中返回一个数组。这在语言中是不允许的。也就是说,返回类型不能是数组。但是,有一个相当简单的方法可以解决这个问题:您可以返回类的实例,并且可以将数组存储为类的成员。标准库中有此类数组包装类的模板。它被称为std::array

以下是返回子数组的示例:

constexpr std::size_t page_size = 256;

std::array<int, page_size>
PagedArray::operator[] (int){
    std::array<int, page_size> page;
    std::copy(completeArray, page);
    return page;
}

鉴于您最初尝试返回引用,您可能正在寻找一种方法来避免使用间接复制子数组。一个问题是子数组在调用函数之前不存在任何地方,并且您无法返回对您在函数中创建的内容的引用。

您可以返回指向大数组的子范围,而不是返回对小数组的引用。标准库中实际上有不止一个选项。有一个通用目的std::ranges::subrange,也std::span特定于连续范围。假设您没有对大容器的类型进行模板化,我建议使用更具体的类型。例子:

std::span<int, page_size>
PagedArray::operator[] (int){
    return {completeArray, page_size};
}

推荐阅读