Bir

2016-03-21 15 views
0

sınıfının bir veri üyesi olarak statik olarak bildirilen 2-D dizisi C++ unsigned NR, unsigned NC veri üyelerini içeren bir class grid oluşturmaya çalışıyorum ve ayrıca bir double Coordiantes[NR][NC] 2B dizi içermelidir. Veri kurucu aracılığıyla NR ve NC veri üyelerini başlatmak istiyorum. Önbellek kayıplarını olabildiğince önlemek için bitişik bellek ayırmayı tercih ettiğim için 2-D dizisinin dinamik ayırmasından kaçınmaya çalışıyorum.Bir

Bunun mümkün olup olmadığından emin değilim, ancak herhangi bir girdi yardımcı olabilir.

+0

std :: vector yerine neden kullanılmıyor? –

+0

Ben böyle bir statik dizi oluşturmak için derleme zamanında NR ve NC bilinmesi gerektiğine inanıyorum. Http://stackoverflow.com/questions/21943621/how-to-create-a-contiguous-2d-array-in-c adresine baktınız mı? –

+0

'vektörü >" amacı çözecektir, ancak yakın zamanda "vektör > A" 'ya erişmeyi bilmeye geldim. A', çift A [m] [n] 'ye kıyasla oldukça yavaştır. – user3496912

cevap

3
class Array2D { 
public: 
    vector<int> v; 
    int nc; 
    Array2D(int NR, int NC) : v(NR*NC), nc(NC) {} 
    int* operator[](int r) { return &v[r*nc]; } 
}; 

int main() 
{ 
    Array2D array2d(2, 3); 
    array2d[0][0] = 1; 
    array2d[1][2] = 6; 
} 

Bu, bir 2B dizi gibi işlev görecek bir sınıf oluşturmanıza izin verir. Hızlı ve veri bitişik.

+0

Bu, gördüğüm en temiz uygulamadır. Özellikle hoş olan, ** dahili operatör [] ** 'nin, ikinci boyuta özel olarak uygulamak zorunda kalmadan içeriğe erişmek için kullanılmasıdır. – SomeWittyUsername

+0

@SomeWittyUsername - Teşekkürler! Muhtemelen bir C programcısı olduğum için yardımcı oldu. Yine de modern C++ yi seviyorum. – doug

2

std::vector<double>(NC*NR)'u kullanmanız önerilir.
Ve buna coord.at(i*NC + j) (veya coord[i*NC + j] kod numarasının doğru olduğu ve performansını artırmak istediğinizde) dizinine ekleyin.

Kendi bellek ayırmanızı yapmadan bitişik bellek ve önbellek dostu döngüler alacaksınız. Mümkün olduğunda daima RAII'yi tercih edin.