从2D数组C ++中提取行或列

时间:2012-04-11 14:16:47

标签: c++ arrays

我想创建一个接收二维数组并将其中一行('which')作为简单数组返回的函数。我写了这个:

int *row(int *array, int lines, int columns, int which)
{
    int result[columns];

    for (int i=0; i<columns; i++)
    {
        result[i] = *array[which][i];
    }
    return result;
}

然而,在第7行中,我收到以下错误:数组下标的类型'int [int]'无效。知道如何正确地做到这一点?我还尝试将2D数组作为数组数组处理,但没有成功。我是新手,所以请避免使用过于先进的概念。

感谢您的帮助!

更新:感谢您的帮助!现在我的代码看起来像:

int n;  //rows
int m;  //columns
int data[100][100];   
int array[100];

int *row(int *array, int rows, int columns, int which)
{
    int* result = new int[columns];
    for (int i=0; i<columns; i++)
    {
        result[i] = *array[which*columns+i];
    }
    return result;
    delete[] result;
}

int main()
{
    array=row(data, n, m, 0);
}

我在main中仍然出现错误:'int *'赋值给'int [100]'

的不兼容类型

现在可能出现什么问题?我也不知道在哪里使用delete []函数来释放数组。

非常感谢您的帮助!

6 个答案:

答案 0 :(得分:4)

你不能这样做:

int result[columns];

您需要动态分配:

int* result = new int[columns];

此外,您对array的使用看起来不对。如果array将成为单个指针,那么您需要:

result[i] = array[which*columns + i];

答案 1 :(得分:2)

“数组”是一维的。您可以通过:array [which * columns + i]访问索引[which] [i]的元素。同样删除星号,因为数组只是一个指针。

编辑:你也不能返回本地数组 - 你需要处理动态内存:

int* result = new int[columns];

然后特别注意释放这段记忆。其他选择是使用std :: vector。

答案 2 :(得分:1)

首先需要修复的错误很少。

  1. 您永远不应该从函数返回指向局部变量的指针。在上面的代码中,您试图返回一个指向“结果”内容的指针,该结果是一个局部变量。
  2. 无法使用可变大小声明数组,在您的情况下是变量列。
  3. 如果数组是一个二维数组,我认为这是你的意图,那么数组[] [i]给你一个int。你不必去引用它。
  4. 虽然我知道我不遵循这里的帖子礼仪,但我建议你先从一本好的教科书开始,抓住基础知识并在遇到问题时来到这里。

答案 3 :(得分:1)

数组的大小需要是编译时常量。

您应该使用std::vector(可能还有2D矩阵类),而不是乱搞数组。

答案 4 :(得分:0)

您可以使用std::vector

来避免所有这些指针算术和内存分配
#include <vector>
#include <iostream>

typedef std::vector<int> Row;
typedef std::vector<Row> Matrix;

std::ostream& operator<<(std::ostream& os, const Row& row) {
  os << "{ ";
  for(auto& item : row) {
    os << item << ", ";
  }
  return os << "}";
}

Row getrow(Matrix m, int n) {
  return m[n];
}

Row getcol(Matrix m, int n) {
  Row result;
  result.reserve(m.size());
  for(auto& item : m) {
    result.push_back(item[n]);
  }
  return result;
}

int main () {
  Matrix m = {
    { 1, 3, 5, 7, 9 },
    { 2, 4, 5, 6, 10 },
    { 1, 4, 9, 16, 25 },
  };

  std::cout << "Row 1: " << getrow(m, 1) << "\n";
  std::cout << "Col 3: " << getcol(m, 3) << "\n";  
}

答案 5 :(得分:0)

double *row(double **arr, int rows, int columns, int which)
{
double* result = new double[columns];
for (int i=0; i<columns; i++)
{
    result[i] = arr[which][i];

}
return result;
delete[] result; 
}

这将返回该行。