2016-08-10 2 views
0

, например, у меня есть массив пар (который является статической переменной) а [], которая представляет собой координаты точек А, В, С:Можно ли автоматически генерировать массив жесткого кода в соответствии с данными другого массива жесткого кода?

pair<float,float> MyClass::a[]={{0,0},{320,568},{640,0}}; 

и я хочу еще один массив B [], который хранит длину АВ и ВС:

float MyClass::b[sizeof(a)/sizeof(pair<float,float>)-1]={ 
    sqrt((a[1].first-a[0].first)*(a[1].first-a[0].first)+(a[1].second-a[0].second)*(a[1].second-a[0].second)), 
    sqrt((a[2].first-a[1].first)*(a[2].first-a[1].first)+(a[2].second-a[1].second)*(a[2].second-a[1].second)) 
}; 

но б [] не очень ремонтопригодны, потому что если я добавить элементы к [], мне нужно изменить б [] вручную. Существуют ли какие-либо методы, которые могут генерировать b [] автоматически? Есть ли что-нибудь подобное, например: макросы

float b[]={MACRO(a)}; 

или

float b[]={MACRO(sizeof(a)/sizeof(pair<float,float>))}; 

или шаблон:

template<int i> 
struct s{ 
    float b[]={something a[i+1]-a[i]}; 
}; 

s<sizeof(a)/sizeof(pair<float,float>)> _s; 

или другие шаблоны проектирования, что позволяет мне изменить размер а [] без изменения б [] вручную или даже не нужно изменять другие части кодов?

+0

Используйте 'станд :: VECTOR' и' for' петля для его заполнения. –

ответ

1

Один очевидный ответ будет использовать вектор вместо массива:

template <class T, size_t N> 
size_t elements(T (&array)[N]) { 
    return N; 
} 

// could also use a vector for a, if desired: 
pair<float,float> a[]={{0,0},{320,568},{640,0}}; 
vector<float> b; 

for (int i=1; i<elements(a); i++) { 
    float dx = a[i].first - a[i-1].first; 
    float dy = a[i].second - a[i-1].second; 
    b.push_back(sqrt(dx*dx + dy * dy)); 
} 

с этим, изменение размера a не требует каких-либо других изменений для b правильно отслеживать его размер.

Есть, конечно, другие способы выполнения задания. Например, если вы делаете это довольно много, вы можете обернуть все это в class. Я не уверен, что действительно что-то имеет смысл.

0

Самая большая проблема здесь в использовании C-массивов; их нелегко инициализировать. С станд :: массив, это очень легко:

pair<float,float> MyClass::a[]={{0,0},{320,568},{640,0}}; 
auto b = sqrt(a); 

с

template<typename T, size_t N> 
std::array<T, N> sqrt(std::pair<T,T> (&points)[N]) 
{ 
    using std::sqrt; 
    std::array<T, N> retval; 
    for (int i = 0; i != N; ++i) { 
     retval[i] = sqrt(points[i].first * points[i].first + 
         points[i].second * points[i].second) ; 
    } 
    return retval; 

}

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