1

2 次元配列に基づいて std::vector を初期化したい Visual Studio 2008 C++03 アプリケーションがあります。

例えば:

#define DATA_SIZE 6

struct Data
{
    UINT a;
    BYTE b;
    BYTE c;
    BYTE d;

    Data()
        : /* initialize all members to 0*/
    {
    };

    explicit Data( const BYTE data[ DATA_SIZE ] )
        : a( data[ 0 ] << 16 | data[ 1 ] << 8 | data[ 2 ] ),
          b( data[ 3 ] ),
          c( data[ 4 ] ),
          d( data[ 5 ] )
    {
    };
};

inline bool operator==( const Data& lhs, const Data& rhs )
{
    return /* true if all members are equal */
};

int main( int argc, char* argv[] )
{
    const BYTE source[][ DATA_SIZE ] = 
    {
        { 0x01, 0xfe, 0xaa, 0x01, 0xcc, 0x13 },
        { 0x02, 0xa1, 0x02, 0xbb, 0x02, 0xdd }
    }

    // how should this be done?
    std::vector< Data > data_list( source[ 0 ], source[ countof( source) - 1 ] );

    ASSERT( data_list[ 0 ] == Data( source[ 0 ] ) );
    ASSERT( data_list[ 1 ] == Data( source[ 1 ] ) );
    return 0;
}

配列for内の各項目を反復処理して呼び出すループなしでこれを行う方法はありますか?datapush_back

4

2 に答える 2

3

できる最小の変更は次のとおりです。

std::vector< Data > data_list(
  &source[ 0 ],
  &source[ countof( source) ] );
于 2012-05-21T17:07:34.163 に答える
1

Boost.Arrayを使用したアプローチは次のとおりです。

#include <cstddef>
#include <cassert>
#include <vector>
#include <boost/array.hpp>

typedef unsigned UINT;
typedef unsigned char BYTE;

std::size_t const DATA_SIZE = 6;

struct Data
{
    UINT a;
    BYTE b, c, d;

    Data() : a(), b(), c(), d() { }

    Data(boost::array<BYTE, DATA_SIZE> const& data)
      : a(data[0] << 16 | data[1] << 8 | data[2]),
        b(data[3]),
        c(data[4]),
        d(data[5])
    { }
};

inline bool operator ==(Data const& lhs, Data const& rhs)
{
    return lhs.a == rhs.a
        && lhs.b == rhs.b
        && lhs.c == rhs.c
        && lhs.d == rhs.d;
}

int main()
{
    boost::array<boost::array<BYTE, DATA_SIZE>, 2> const source =
    {{
        {{ 0x01, 0xfe, 0xaa, 0x01, 0xcc, 0x13 }},
        {{ 0x02, 0xa1, 0x02, 0xbb, 0x02, 0xdd }}
    }};

    std::vector<Data> data_list(source.begin(), source.end());

    assert(data_list[0] == Data(source[0]));
    assert(data_list[1] == Data(source[1]));
}

オンラインデモ

于 2012-05-21T17:09:27.177 に答える