Как преобразовать вектор целочисленных массивов в двумерный массив в C ++? - PullRequest
0 голосов
/ 28 февраля 2019

Итак, я искал следующий пост для преобразования вектора в массив, но этот метод, похоже, не подходит для моего случая использования.

Как преобразовать вектор в массив

vector<array<int, 256>> table; // is my table that I want to convert

// There is then code in the middle that will fill it

int** convert = &table[0][0] // is the first method that I attempted

convert = table.data(); // is the other method to convert that doesn't work

Я верю, что мое понимание внутреннего типа данных - это то, где мои знания не дотягивают.Буду признателен за любую помощь по этому вопросу

edit: я изменил массивы в стиле C на массивы C ++

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Хотя будет существовать маршрут, который должен работать через приведение, простейшая вещь, которую я могу гарантировать, будет работать - это создать массив указателей на int s, который содержит указатели на массивы в источнике vector.

// make vector of pointers to int
std::vector<int*> table2(table.size());

// fill pointer vector pointers to arrays in array vector
for (int i = 0; i < size; i++ )
{
    table2[i] = table[i];
}

Пример:

#include <vector>
#include <iostream>
#include <iomanip>
#include <memory>

constexpr int size = 4;

// test by printing out 
void func(int ** arr)
{
    for (int i = 0; i < size; i++ )
    {
        for (int j = 0; j < size; j++ )
        {
            std::cout << std::setw(5) << arr[i][j] <<  ' ';
        }
        std::cout << '\n';
    }
}

int main()
{
    std::vector<int[size]> table(size);

    // fill values
    for (int i = 0; i < size; i++ )
    {
        for (int j = 0; j < size; j++ )
        {
            table[i][j] = i*size +j;
        }
    }

    // build int **
    std::vector<int*> table2(table.size());
    for (size_t i = 0; i < size; i++ )
    {
        table2[i] = table[i];
    }

    //call function
    func(table2.data());

}

Похоже, вы застряли, выполняя это из-за требования int **, когда возможно попытайтесь использовать aкласс простой матрицы вместо.

0 голосов
/ 28 февраля 2019

Предполагая использование C ++ 11, include <algorithm>

, вы, вероятно, могли бы использовать std :: copy.

Я не проверял это, но считаю, что вы могли бы просто сделать:

std::copy(&table[0][0], &table[0][0]+256*table.size(), &myArray[0][0]);

где параметры эффективны:

std::copy(<source obj begin>, <source obj end>, <dest obj begin>);

Подробнее об этом здесь: https://en.cppreference.com/w/cpp/algorithm/copy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...