Re: Converting an array to a multidimensional one
On Nov 18, 9:14 pm, Slain <Slai...@gmail.com> wrote:
I need to convert a an array to a multidimensional one. Since I need
to wrok with existing code, I need to modify a declaration which looks
like this
In the .h file
int *x;
in a initialize function:
x = new int[$Row_Length];
Now I need the x to be able to point to a multidimensional array
I would ahve been fine, with something like
int (*x)[Column_Length] = new int [Row_Length][Column_Length];
But since my variable x needs to be declated in the header file, I am
having some problems compiling. Can some one explain me how to declare
and initialize?
Thank you
Use a vector of vectors instead, much easier and it brings many
dividends (its dynamic, easy to extend - like providing iterators to
the interface). Instead of dealing with heap allocated pointers that
blindly point to whatever in an exception-unsafe way, deal with
objects instead.
// array2d.h, missing include guard
#include <vector>
class Array2D
{
typedef std::vector< int > VecN;
// members
std::vector< VecN > m_vvn; // 2D array
public:
// ctors
Array2D(std::size_t, std::size_t);
Array2D(std::size_t, std::size_t, const int);
// member functions
std::size_t size() const { return m_vvn.size(); }
VecN operator[](std::size_t index) { return m_vvn[index]; }
void display() const;
};
// array2d.cpp
#include <iostream>
#include <algorithm>
#include <iterator>
#include "array2d.h"
Array2D::Array2D(std::size_t rows, std::size_t cols)
: m_vvn(rows, std::vector< int >(cols)) { }
Array2D::Array2D(std::size_t rows, std::size_t cols, const int n)
: m_vvn(rows, std::vector< int >(cols, n)) { }
void Array2D::display() const
{
typedef std::vector< VecN >::const_iterator VIter;
for(VIter it = m_vvn.begin(); it != m_vvn.end(); ++it)
{
std::copy( (*it).begin(),
(*it).end(),
std::ostream_iterator< int >(std::cout, " ") );
std::cout << std::endl;
}
}
// main.cpp
#include "array2d.h"
int main()
{
Array2D a2d(4, 4, 99);
std::cout << "rows: " << a2d.size() << std::endl;
std::cout << "columns: " << a2d[0].size() << std::endl;
a2d.display();
}
/*
rows: 4
columns: 4
99 99 99 99
99 99 99 99
99 99 99 99
99 99 99 99
*/