【问题标题】:Reference to a static 2D array?引用静态二维数组?
【发布时间】:2014-04-09 23:09:02
【问题描述】:

我有一些静态大小的二维数组:

double quickStats[NUM_REPETITIONS][NUM_TRIALS];
double mergeStats[NUM_REPETITIONS][NUM_TRIALS];
double bstStats[NUM_REPETITIONS][NUM_TRIALS];

稍后,我想引用其中一个:

double stats[NUM_REPETITIONS][NUM_TRIALS];

    if(i == 0) {
        stats = quickStats;
    }
    else if(i == 1) {
        stats = mergeStats;
    }
    else if(i == 2) {
        stats = bstStats;
    }

但是,这不起作用。

如果没有嵌套的 for 循环手动将每个元素复制到引用数组中,我该怎么做?

我只需要从stats中读取,这是为了避免冗余代码。

谢谢

【问题讨论】:

  • 我假设您不想要独立副本?
  • 我假设你想要一个指针而不是引用?引用必须在声明时初始化,因此您以后无法分配它。最好的选择是使用指针或在 if 分支中声明引用。

标签: c++ arrays


【解决方案1】:

试试这个:

#define NUM_REPETITIONS 10
#define NUM_TRIALS 10
double quickStats[NUM_REPETITIONS][NUM_TRIALS];
double mergeStats[NUM_REPETITIONS][NUM_TRIALS];
double bstStats[NUM_REPETITIONS][NUM_TRIALS];

int main(){
    double (* ptr)[NUM_TRIALS] =quickStats;
}

【讨论】:

  • 对 OP 进行更多解释;使用这种语法,您可以通过ptr[3][4] 访问元素。您也可以指向不同重复次数的列表,但试验次数必须保持固定。
  • @MattMcNabb,感谢您的编辑和评论。我正在使用 Vim 的自动完成功能,并没有给予足够的重视。 :)
【解决方案2】:

像这样创建一个指向它的指针:

double (*stats)[NUM_REPETITIONS][NUM_TRIALS];

由于您的尺寸在编译时已知,您可以使用std::array<>,它更通用且可读性更强:

std::array<std::array<double, NUM_TRIALS>, NUM_REPETITIONS> stat;

【讨论】:

  • 那个引用应该分配给something,对吧?考虑到 OP 的问题,只有稍微邪恶的三元表达式堆栈才会起作用。
【解决方案3】:

引用必须在声明时初始化,因此您以后无法分配它。最好的选择是使用指针或在 if 分支中声明引用。

constexpr unsigned int N = 100;

double a[N][N] = {0};

/* Pointer. In your case, N should be NUM_TRAILS here */
double (*a_ptr)[N] = a;


/* Specified Reference Type */
double (&a_ref)[N][N] = a;

/* C++11 Auto Reference */
auto &a_autoref = a;

在这里测试:Coliru

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2022-10-01
    • 2018-09-03
    相关资源
    最近更新 更多