2012-05-21 2 views
1

У меня есть приложение Visual Studio 2008 C++ 03, где я хотел бы инициализировать std :: vector на основе двухмерного массива.инициализация вектора на основе массива 2d

Например:

#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 петли перебора каждого элемента в массиве data и вызывающего push_back?

+0

@ildjarn - отредактировано, чтобы сделать это более четким. – PaulH

+0

Если вы удалили ключевое слово 'explicit ', это не позволило бы компилятору неявно преобразовывать массивы BYTE в объекты Data? – Dennis

+0

Если вы использовали 'std :: tr1 :: array ' вместо сырых C-массивов, это было бы совершенно тривиально. – ildjarn

ответ

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

Online demo.

+0

+1 за дополнительные усилия онлайн-демонстрации – PaulH

3

Наименьшее изменение, которое вы могли бы сделать это:

std::vector<Data> data_list(
    &source[ 0 ], 
    &source[ countof(source) ]); 
+0

в сочетании с тем, что ctor не является явным. верный? – PaulH

+0

По крайней мере, на G ++, ctor может быть явным. http://ideone.com/wh6Wz –

Смежные вопросы