C ++ 'da yeniden boyutlandırma, yapıcıları ve yıkıcıları çağırma olasılığından dolayı gariptir.
C ++ ' resize[]
da gidecek bir operatörünüzün olmamasının temel bir nedeni olduğunu sanmıyorum new[]
ve delete[]
bu şuna benzer bir şey yaptı:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Açıkçası oldsize
gizli bir yerden alınacaktı, aynı olduğu gibi delete[]
veType
işlenen türde gelirdi. resize[]
Tür kopyalanamadığında başarısız olur - bu doğrudur, çünkü bu tür nesneler yeniden konumlandırılamaz. Son olarak, yukarıdaki kod, nesneleri atamadan önce varsayılan olarak inşa eder, ki bunu gerçek davranış olarak istemezsiniz.
newsize <= oldsize
Yeniden küçültülmüş dizinin "sonunu geçen" nesneler için yıkıcıları çağırmak ve başka hiçbir şey yapmamak için olası bir optimizasyon var . Standart, bu optimizasyonun gerekli olup olmadığını tanımlamalıdır (resize()
bir vektörde olduğu gibi), izin verilip verilmediğini, izin verilip verilmediğini, ancak uygulamaya bağlı mı yoksa yasak .
O zaman kendinize sormanız gereken soru, "bunu sağlamak gerçekten yararlı mıdır? vector
da yapıyor ve özellikle yeniden boyutlandırılabilir bir kap (bitişik bellek - bu gereksinim C ++ 98'de ihmal edildi, ancak C ++ 03'te düzeltildi) bu, işleri yapmak için C ++ yöntemlerine sahip dizilerden daha uygun mu? "
Bence yanıtın yaygın olarak "hayır" olduğu düşünülüyor. Yeniden boyutlandırılabilir arabellekleri C yolu ile yapmak istiyorsanız malloc / free / realloc
, C ++ 'da bulunanları kullanın . Yeniden boyutlandırılabilir arabellekleri C ++ yolu ile yapmak istiyorsanız, bir vektör kullanın (veya deque
aslında bitişik depolamaya ihtiyacınız yoksa). new[]
Vektör benzeri bir kap uygulamadığınız sürece, bu ikisini ham tamponlar için kullanarak karıştırmaya çalışmayın .