Phorce
Phorce

Reputation: 2674

Converting 1D to 2D?

This might seem like a stupid question but it's really bugging me.

Basically, I have a 1D array that I need to convert into a 2D array. Basically, the size of the array is: 62017 now from this, I need to get the Rows and Cols of this. But, do this dynamically, so for example, it would take the number of say: 43101 and then establish the rows+cols and then re-size the vector accordingly.

I hope I've explained enough and hope someone can help, thanks :)

Upvotes: 2

Views: 266

Answers (2)

MartyE
MartyE

Reputation: 656

And here it is old school array style (since I can't access a C++0x compiler at the moment)

#include <iostream>
//#include <array>
#include <inttypes.h>
#include <math.h>

void calc_new_sizes(const size_t old_size, size_t& new_size1, size_t& new_size2)
{
    new_size1 = 1;
    new_size2 = 1;
    size_t stop_at = (size_t)sqrt(old_size) + 1;
    for (size_t i = 1; i<stop_at; i++)
    {
        if ( old_size % i == 0 )
        {
            new_size1 = i;
            new_size2 = old_size / i;
        }
    }
}

template <class T>
T** twoDimensionify(T* p_old_array, const size_t old_size)
{
    size_t new_size1=1, new_size2=1, old_i=0;
    calc_new_sizes(old_size, new_size1, new_size2);
    T** returnValue = new T*[new_size1];
    for (size_t i=0; i<new_size1; i++)
    {
        returnValue[i] = new T[new_size2];
        for (size_t j=0; j<new_size2; j++)
        {
            returnValue[i][j] = p_old_array[old_i];
            old_i++;
        }
    }
    return returnValue;
}

int main()
{
    size_t old_size=20, new_size1=0, new_size2=0;
    calc_new_sizes(old_size, new_size1, new_size2);
    std::cout << "From " << old_size << " to " << new_size1 << "x" << new_size2 << std::endl;

    int old_array[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
    int **new_array = twoDimensionify<int>(old_array, 20);
    for (size_t i=0; i<new_size1; i++)
    {
        for (size_t j=0; j<new_size2; j++)
        {
            std::cout << "new array[" << i << "," << j << "] = " << new_array[i][j] << std::endl;
        }
    }

    // Clean up my memory.  This is C++ afterall.
    for (size_t i=0; i<new_size1; i++)
    {
       delete [](new_array[i]);
    }
    delete []new_array;
    return 0;
}

Upvotes: 1

MartyE
MartyE

Reputation: 656

I believe you're looking for something like this. Though with some challenges accessing a proper compiler I can't verify...

#include <iostream>
#include <array>
#include <inttypes.h>
#include <math.h>

void calc_new_sizes(const size_t old_size, size_t& new_size1, size_t& new_size2)
{
    new_size1 = 1;
    new_size2 = 1;
    size_t stop_at = (size_t)sqrt(old_size) + 1;
    for (size_t i = 1; i<stop_at; i++)
    {
        if ( old_size % i == 0 )
        {
            new_size1 = i;
            new_size2 = old_size / i;
        }
    }
}


template <class T, size_t new_size_1, size_t new_size_2, size_t old_size>
std::array<new_size_1, std::array<T, new_size_2>> twoDimensionify(std::array<T, old_size> p_input)
{
    std::array<new_size_1, std::array<T, new_size_2>> returnValue;
    int old_i = 0;
    for (int i=0; i<new_size_1; i++)
    {
        for (int j=0; j<new_size_2; j++)
        {
            returnValue[i][j] = p_input[old_i];
            old_i++;
        }
    }

    return returnValue;
}

int main()
{
    size_t old_size=20, new_size1=0, new_size2=0;
    calc_new_sizes(old_size, new_size1, new_size2);
    std::cout << "From " << old_size << " to " << new_size1 << "x" << new_size2 << std::endl;

    return 0;
}

Upvotes: 1

Related Questions