Initialize boost / multi_array array

I defined boost::(multi_)arrayusing

typedef boost::multi_array<unsigned int, 1>  uint_1d_vec_t;
typedef boost::multi_array<unsigned int, 2>  uint_2d_vec_t;

uint_1d_vec_t    foo( boost::extents[ num_elements   ]          );
uint_2d_vec_t    boo( boost::extents[ num_elements/2 ][ kappa ] );

were num_elements/2ist an integer, but kappaa double, but contains only integers (for example, 79).

How can I initialize fooand booto 0, when the number of elements in their side is known only at runtime?

+3
source share
4 answers

changing line

  std::fill( boo.begin()->begin() , boo.end()->end() , 0);

to

  std::fill( boo.origin(), boo.origin() + boo.size(), 0 );

solved my problem

+2
source
uint_1d_vec_t    foo( boost::extents[ static_cast< uint_1d_vec_t::index >( num_elements   ) ]          );
uint_2d_vec_t    boo( boost::extents[ static_cast< uint_2d_vec_t::index >( num_elements/2 ) ][ static_cast< uint_2d_vec_t::index >( kappa ) ] );
-1
source

calloc, boost:: multi_array_ref.

-1

std::fill( foo.begin() , foo.end()    , 0);

( , , boost:: assign, ).

boo ,   std:: fill (boo.begin() → begin(), boo.end() → end(), 0); pass, , :

/usr/include/boost/multi_array/base.hpp:178: Reference boost :: detail :: multi_array :: value_accessor_one :: access (boost :: type, boost :: multi_array_types :: index, TPtr, const boost :: multi_array_types :: size_type *, const boost :: multi_array_types :: index *, const boost :: multi_array_types :: index *) const [with Reference = unsigned int &, TPtr = unsigned int *, T = unsigned int]: Statement `size_type ( idx - index_bases [0]) <extents [0] 'failed.Blockquote

here is a short code:

#include <iomanip>
#include "boost/multi_array.hpp"
#include <iostream>

namespace vec {
   typedef boost::multi_array<unsigned int, 1>  uint_1d_vec_t;
   typedef boost::multi_array<unsigned int, 2>  uint_2d_vec_t;
   typedef uint_1d_vec_t::index                 index_1d_t;
   typedef uint_2d_vec_t::index                 index_2d_t;
}

using namespace std;

int main( ) { 

   unsigned int num_elements, num_bits, max_runs, m;
   num_bits = 12;
   max_runs = 5000;
   m        = 2;

   num_elements = ( 1 << num_bits );

   double kappa = 79;

   vec::uint_1d_vec_t    foo( boost::extents[ static_cast< vec::index_1d_t >(num_elements) ]                                          );
   vec::uint_2d_vec_t    boo( boost::extents[ static_cast< vec::index_2d_t >(num_elements) ][ static_cast< vec::index_2d_t >(kappa) ] );

   std::fill( foo.begin()          , foo.end()        , 0);
   std::fill( boo.begin()->begin() , boo.end()->end() , 0);

   std::cout << "Done" << std::endl;

   return EXIT_SUCCESS;
}
-3
source

Source: https://habr.com/ru/post/1726734/


All Articles