2010-11-24 3 views
5

Bu kod, 100 öğeden oluşan bir dizi oluşturacak ve her birinin değerini false olarak ayarlayacaktır.Dinamik dizinin varsayılan değerini ayarlama

bool boolArray[100] = false; 

Dinamik bir dizinin varsayılan değerini nasıl ayarlayabilirim?

void Foo(int size) 
{ 
    bool boolArray = new bool[size]; 
    //Now what? 
} 
+1

O 'bool * boolArray' değil' bool boolArray' (yani sadece tek olurdu oluyor bool, yani 'yeni bir şey' atama bile mantıklı olmazdı. – ThiefMaster

+0

İlk satır '... = {false}; –

cevap

11

İster

bool foo(int size) 
{ 
    bool* boolArray = new bool[size]();  // Zero-initialized 

    // Check that it is indeed zero-initialized: 
    for(int i = 0; i < size; ++i) 
    { 
     if(boolArray[i]) { delete[] boolArray; return false; } 
    } 
    delete[] boolArray; return true; 
} 

#include <iostream> 
int main() 
{ 
    using namespace std; 
    cout << (foo(42)? "OK" : "Ungood compiler") << endl; 
} 

senin derleyici doğru şeyi kabul eder, hatta yapar.

Yani, uygulamada, eğer bir ham dizi kullanmaya karşı konulmaz bir dürtü hissediyorum, o zaman belki daha iyi std::fill ya da bazı tür, hatta çiğ döngü kullanın.

Ancak yinelenen delete[] ifadelerini not edin. Bu gereksiz kodun yanlış olması çok kolaydır: Kötü ™. Ve işlenmemiş dizilerin kullanımı ile yanlış gidebilecek başka bir şey var, bu yüzden bir acemi olarak, sadece ™ numaralarını ham dizilere ve ham işaretlere ve benzerlerine bildirin. Bunun yerine, – doğru şekilde sizin için tahsis, başlatma, kopyalama ve serbest ayırmayı yöneten standart kitaplık kaplarını kullanın. Bununla birlikte, küçük bir problem var, yani, std::vector<bool>'da, aksi takdirde doğal seçim olan erken bir optimizasyon. Aslında, std::vector<bool> değeri, değer başına yalnızca bir bit kullanır, böylece bool öğelerine yapılan başvurular dağıtılmaz, bunun yerine proxy nesneleri ve hellip;

bool öğeleri için, örn. std::bitset (boyut derleme zamanında biliniyorsa) veya ör. Bir std::deque, aşağıdaki gibi:.

#include <deque> 

bool foo(int size) 
{ 
    std::deque<bool> boolArray(size);  // Zero-initialized 

    for(int i = 0; i < size; ++i) 
    { 
     if(boolArray[i]) { return false; } 
    } 
    return true; 
} 

#include <iostream> 
int main() 
{ 
    using namespace std; 
    cout << (foo(42)? "OK" : "Ungood compiler") << endl; 
} 

Şerefe & hth,

2
bool* boolArray = new bool[size]; 
for(int i = 0; i < size; i++) { 
    boolArray[i] = false; 
} 
+0

+1: Mehrdad'ın std :: fill önerisi (aynı zamanda + 1-ed) olarak" zarif "değil, ama çok temel ve yeniden kullanılabilir Emin olmadığında ulaşmak için üretken yaklaşım. –

11

kullanın std::fill function veya std::fill_n function.

std::fill_n(boolArray, length, defaultValue); 
std::fill(boolArray, boolArray + length, defaultValue); 

Yan not: yerine std::vector kullanmayı deneyin. Ayrıca sonuç denetler ve diziyi kaldırır

bool* boolArray = new bool[size]();  // Zero-initialized 

Komple programı:: o dizinin dahil olmak üzere hemen her şey varsayılan-başlatabilir ++ standardı C

+0

Bunun için 'std :: vector' kullanma bazı problemlere sahiptir; cevabımı gör. Ayrıca, “std :: fill” kullanılırken, OP sorununun genelleştirilmesi için kesinlikle iyi bir çözümdür, eldeki sorun için gerekli değildir. Yine cevabımı gör. Şerefe & hth., –

0

Ne hakkında:

void Foo(int size) 
{ 
    // bool boolArray = new bool[size]; 
    // Did you mean bool*? 
    // Try and avoid direct allocation of memory. 
    // Memory allocation should be done inside an object that 
    // actively manages it. 

    // Normally I would recommend a vector 
    std::vector<bool> boolArray(size, false); 

    // But. And a Big but. Is that the standards committee decided to 
    // specialize the vector for bool so that each element only takes 
    // a single bit. Unfortunately this had some side effects that were 
    // made its use not perfect (time/assign-ability). 

    // So we can try a boost array 
    boost::array<bool, size> boolArray; 
} 
+0

Uhm, sadece bir nit, run-time 'size' şablon argümanı olarak kullanamazsınız (kod yazarken olduğu gibi). Belki de, çalışma zamanı boyutuna izin veren dizi var mı? Cevabımdaki std :: sıraya iniş yaptım, ama herkesin farklı tercihleri ​​var ... Şerefe, –

+0

uh, yazım hatası, cevapta görüldüğü gibi, cevabımdaki 'std :: deque' üzerine indiğimi kastediyordum ... ama yine de, kodunuz şu anda, 'boost :: dizi 'ile, burada' boyut 'bir çalışma zamanı değeridir, derleme yapmaz. Şerefe & hth. –