Re: get 1D row of 2D vector array
On May 10, 3:42 am, Matthias Pospiech <matthia...@gmx.de> wrote:
I have an 2D vector array, but a function that can calculate only with
1D arrays. Now I need to pass every row of the 2D array to that function.
So how can I pass a part (row or column) of a 2D vector array to a
function as a pointer - the result shall be in the 2D array automatically.
With C-Arrays A[N][N] I know the solution by passing
function(A + x*N);
Matthias
Pass the whole array by reference:
#include <iostream>
template< typename T,
const size_t Row,
const size_t Col >
void function(T (& array)[Row][Col])
{
for(size_t r = 0; r < Row; ++r)
{
for(size_t c = 0; c < Col; ++c)
{
std::cout << array[r][c];
std::cout << ", ";
}
std::cout << std::endl;
}
}
int main()
{
int A[2][2] = {{1,2},{3,4}};
function( A );
}
/*
1, 2,
3, 4,
*/
A much simpler solution is use a vector of vectors since you can
initialize values on construction.
#include <iostream>
#include <vector>
#include <algorithm> // for std::copy
#include <iterator> // for ostream_iterator
// global op<< overload
template< typename T >
std::ostream&
operator<<( std::ostream& os,
std::vector< std::vector< T > >& r_vvt)
{
typedef typename std::vector< std::vector< T > >::iterator VIter;
for(VIter viter = r_vvt.begin(); viter != r_vvt.end(); ++viter)
{
std::copy( (*viter).begin(),
(*viter).end(),
std::ostream_iterator< T >(os, ", ") );
os << std::endl;
}
return os;
}
int main()
{
std::vector< std::vector< int > > vvn(10, std::vector< int >(10,
99));
std::cout << vvn << std::endl;
}