2014-07-27 3 views
0

Это следующий код:Инициализация статического 2D массив

enum Type {Prince, Princess, King, Queen, NumTypes}; 
enum Country {England, Belgium, Netherlands, NumCountries}; 

class Factory { 
    static const std::array<std::array<int, NumTypes>, NumCountries> probabilities; 
    static std::array<std::array<int, NumTypes>, NumCountries> initializeProbabilities() { 
     std::array<std::array<int, NumTypes>, NumCountries> p; 
     p[England] =  {29, 60, 80, 100}; 
     p[Belgium] =  {31, 66, 81, 100}; 
     p[Netherlands] = {25, 45, 90, 100}; 
     return p; 
    } 
}; 
const std::array<std::array<int, NumTypes>, NumCountries> Factory::probabilities = initializeProbabilities(); 

является безопасным, если я когда-либо изменить порядок элементов в перечислениях страны, но это не безопасно из любого будущего изменения порядка перечисление типа элементов. Каков наилучший способ избежать этой проблемы без инициализации всех 12 элементов один за другим?

+0

Вы можете использовать карту ... – Brian

+0

@ Брайан. Но разве это не просто назначение всех 12 элементов один за другим? Разве нет способа сделать это, не назначая каждый элемент отдельно? Представьте, что матрица равна 12 на 30! – prestokeys

+0

Если у вас есть поддержка C++ 11 (что вы, очевидно, делаете, учитывая 'std :: array'), вы можете инициализировать карты с помощью бит-init-lists. – Brian

ответ

0

Это решение, предложенное Брайаном (я думаю, это то, что он имел в виду). Возможно, это лучший способ решить описанные проблемы?

enum Type {Prince, Princess, King, Queen, NumTypes}; 
enum Country {England, Belgium, Netherlands, NumCountries}; 

class Factory { 
    static const std::array<std::map<Type, int>, NumCountries> probabilities; 
    static std::array<std::map<Type, int>, NumCountries> initializeProbabilities() { 
     std::array<std::map<Type, int>, NumCountries> p; 
     p[England] =  { {Prince, 29}, {Princess, 60}, {King, 80}, {Queen, 100} }; 
     p[Belgium] =  { {Prince, 31}, {Princess, 66}, {King, 81}, {Queen, 100} }; 
     p[Netherlands] = { {Prince, 25}, {Princess, 45}, {King, 90}, {Queen, 100} }; 
     return p; 
    } 
}; 
const std::array<std::map<Type, int>, NumCountries> Factory::probabilities = initializeProbabilities(); 

Возможно, он имел в виду карту карты.

1

Для того, чтобы избежать зависимости от заказа, вы должны написать что-то вроде:

p[England][Prince]=29; 
p[England][Princess]=60; 
p[England][King]=80; 
p[England][Queen]=100; 

p[Belgium][Prince]=31; 
p[Belgium][Princess]=66; 
p[Belgium][King]=81; 
p[Belgium][Queen]=100; 
Смежные вопросы