2016-08-10 52 views
0

例如,我有一對陣列(這是一個靜態變量)一個[]表示點A的座標,B,C:是否可以根據另一個硬編碼數組的數據自動生成硬編碼數組?

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

,我想另一個數組b [],其存儲長度AB和BC的:

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 []不是很維護,因爲如果我添加元素的[],我需要手動更改b []。有沒有可以自動生成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; 

或其他設計模式,可以讓我改變的[]大小而不b變更手動或者甚至不需要修改代碼的其他部分?

+0

使用'的std :: 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; 

}