2009-12-28 128 views
3

我已經與初始化升壓陣列/的multi_array

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 ]); 

定義boost::(multi_)arraynum_elements/2 IST的整數,kappa是雙的,但僅包含整數(例如79)。

當它們中的元素數量僅在運行時才知道時,如何初始化fooboo0

+1

@Octavian:謝謝,但在標題中添加標籤與清理相反。 – 2012-01-31 17:19:59

+0

@LightnessRacesinOrbit這似乎是個人觀點。 [我如何寫一個好的標題?](http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title)。 – 2012-01-31 19:00:43

+2

@OctavianDamiean:這個主題的主流觀點是標題中的標籤不好。我們已經有了一個一致的索引標籤系統。 Mods在過去也支持我進行這樣的編輯。當然,不能取悅每個人。 – 2012-01-31 19:47:14

回答

-1
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) ]); 
+0

對不起,但我不明白我在這個解決方案中定義的初始化值在哪裏? – Eagle 2009-12-28 20:51:25

+0

儘管此代碼可能有助於解決問題,但 提供了有關_why_和/或_how_的其他上下文,回答該問題將顯着提高其長期價值。請[編輯]你的答案,添加一些 的解釋。 – 2016-07-15 12:08:20

-3

我用

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

解決我的問題(不知道這是否是更好然後升壓::分配,因爲我無法應用它)。

boo我仍然有問題,因爲 std :: fill(boo.begin() - > begin(),boo.end() - > end(),0); 通編譯,但是當我運行我的程序,我得到以下錯誤:

/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]: Assertion `size_type(idx - index_bases[0]) < extents[0]' failed.Blockquote

這裏是一個短代碼:

#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; 
} 
+2

請編輯您的原始問題,而不是添加不回答問題的答案。 – 2010-01-12 23:01:42

2

變化的線路

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

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

解決了我的問題

+1

您可能想使用'boo.data()'代替。 – updogliu 2012-12-29 08:13:56

+1

也可能想要使用'boo.num_elements()'而不是'boo.size()'。 – wedesoft 2014-09-05 09:52:48

+1

來自'.size()'的文檔_返回a中包含的值的數量。它相當於a.shape()[0]; _同意@wedesoft,你應該使用'.num_elements()' – oLas 2015-12-18 16:54:13

-1

您可能還希望使用calloc,然後用boost :: multi_array_ref包裝返回的內存。