Как передать 1 столбец 2D-матрицы функции в C / C++

У меня есть массив 2D c-стиля, из которого я должен передать только один столбец в функцию. Как мне это сделать?

в основном мне нужен эквивалент C / C++ команды MATLAB A[:,j] что дало бы мне вектор столбца. Возможно ли это на C/C++?

3 ответов


у вас есть 3 варианта,

1) передайте указатель на ваш объект (после перемещения его в первый элемент столбца назначения)

twoDArray[0] [столбец]

теперь вы можете рассчитать следующий элемент для этого столбца (перепрыгивая через элементы)

2) Создайте класс-оболочку, который сделает это за вас.

custom2DArray->getCol(1);
.
.
.
class YourWrapper{
 private:
   auto array = new int[10][10];
 public:
   vector<int> getCol(int col);
}

YourWrapper:: vector<int> getCol(int col){
  //iterate your 2d array(like in option 1) and insert values 
  //in the vector and return
}

3) вместо этого используйте массив 1d. Вы можете легко получить эту информацию. Перепрыгивая через строки и получая доступ к значению для нужного столбца.(Упоминая только ради упоминания, не держите на меня зла)


int colsum(int *a, int rows, int col)
{
    int i;
    int sum = 0;
    for (i = 0; i < rows; i++)
    {
        sum += *(a + i*rows+col);
    }
    return sum;
}    


int _tmain(int argc, _TCHAR* argv[])
{
    int rows = 2;
    int cols = 2;    

    int i, j;    

    int *a;
    a = (int*)malloc(rows*cols*sizeof(int));

    // This just fills each element of the array with it's column number.
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            *(a+i*rows + j) = j;    

        }
    }

    // Returns the sum of all elements in column 1 (second from left)
    int q = colsum(a, rows, 1);

    printf("%i\n", q);
    return 0;
}

Это не ровно передавая столбец, он передает указатель на начало массива, а затем дает ему инструкции о том, сколько строк имеет массив и какой столбец для себя.


учитывая ваш 2d массив:

std::vector<std::vector<int> > *array = new std::vector<std::vector<int> >;
std::list myCol;

... //fill your array

//Here we iterate through each row with an iterator
for (auto it = array->begin(); it != array->end(); ++it)
    //Then we access the value of one col of this row
    myCol.push_back(it[col]);

//MyCol will be filled with the col values


        for col = 1, myCol=[8, 3, 1, 4]
        \/ 
it->[[2, 8, 4, 3],
\/   [6, 3, 9, 6],
     [9, 1, 3, 3],
     [2, 4, 2, 7]]