C ++ 'da std :: resize (n) ve std :: shrink_to_fit arasındaki fark?


11

Bu ifadelere rastladım:

resize(n)- Kapsayıcıyı 'n' öğeleri içerecek şekilde yeniden boyutlandırır.
shrink_to_fit()- Kabın kapasitesini boyutuna uyacak şekilde azaltır ve kapasitenin ötesindeki tüm elemanları yok eder.

Bu işlevler arasında önemli bir fark var mı? onlar c ++ vektörleri altında geliyor


resize, kabın boyutunu değiştirir, shrink_to_fit değiştirmez. Normal kullanım için shrink_to_fit hakkında bilmeniz gerekmez, yalnızca geliştiricilerin kodlarının performansını manuel olarak artırmasını sağlamak için kullanılabilir.
NoSenseEtAl

2
Standart kapların boyutu ve kapasitesi vardır . Boyut, kaptaki geçerli öğe sayısı, kapasite ise ayrılan bellek miktarıdır (kabaca). Yeniden boyutlandırma boyutu shrink_to_fitdeğiştirir, kapasiteyi değiştirir.
Bazı programcı ahbap

2
Eğer arasındaki farkı anlamak mı capacityve size?
Kübik

Yanıtlar:


12

Vektörlerin farklı anlama gelen iki "uzunluk" özelliği vardır:

  • sizevektördeki kullanılabilir elemanların sayısıdır. Bu, sakladığınız şeylerin sayısıdır. Bu kavramsal bir uzunluktur.
  • capacity vektörün şu anda ayırdığı bellek miktarına kaç öğenin sığacağıdır.

capacity >= sizeher zaman doğru olmalı, ama onların her zaman eşit olmaları için hiçbir sebep yok. Örneğin, bir öğeyi kaldırdığınızda, ayırmayı küçültmek, bir kova daha küçük yeni bir ayırma oluşturmayı ve geri kalan içeriği ("ayır, taşı, serbest") taşımayı gerektirir.

Benzer şekilde, capacity == sizebir öğe ekler ve eklerseniz, vektör ayırmayı bir öğe (başka bir "ayırma, taşıma, serbest" işlemi) ile büyütebilir, ancak genellikle birden fazla öğe eklersiniz. Kapasitenin artırılması gerekiyorsa, vektör kapasitesini birden fazla eleman artıracaktır, böylece her şeyi tekrar hareket ettirmeden önce birkaç eleman daha ekleyebilirsiniz.

Bu bilgi ile sorunuza cevap verebiliriz:

  • std::vector<T>::resize()dizinin boyutunu değiştirir . Geçerli boyutundan daha küçük bir boyutta yeniden boyutlandırırsanız, fazla nesneler yok edilir. Geçerli boyutundan daha büyük yeniden boyutlandırırsanız, sonuna eklenen "yeni" nesneler varsayılan olarak başlatılır.
  • std::vector<T>::shrink_to_fit()kapasitenin mevcut boyuta uyacak şekilde değiştirilmesini ister . (Uygulamalar bu talebi yerine getirebilir veya vermeyebilir . Kapasiteyi azaltabilir, ancak boyuta eşit yapamazlar. Hiçbir şey yapamayabilirler.) İstek yerine getirilirse, bu, vektörün tahsisi. Bunu genellikle bir vektör oluşturmayı bitirdiğinizde kullanırsınız ve ona asla başka bir öğe eklemezsiniz. (Kaç tane öğe ekleyeceğinizi önceden biliyorsanız, std::vector<T>::reserve()herhangi bir öğe eklemeden önce herhangi bir öğeye güvenmek yerine vektörü anlatmak daha iyi olur shrink_to_fit.)

Bu nedenle , vektörde kavramsal olarak ne kadar şey olduğunuresize() değiştirmek için kullanırsınız .

Sen kullanmak shrink_to_fit()vektör içten ayırdı aşırı boşluk en aza indirmek için olmadan kadar malzeme vektör içinde kavramsal olarak nasıl değişiyor.


2
Bunun shrink_to_fitya hep ya hiç olmadığını unutmayın. Bir uygulama, kapasiteyi kısmen azaltabilir. Örneğin, vektör kapasitesini iki güçle sınırlayan bir uygulamayı ele alalım.
François Andrieux

5

shrink_to_fit() - Kabın kapasitesini boyutuna uyacak şekilde azaltır ve kapasitenin ötesindeki tüm elemanları yok eder.

Bu, olanların yanlış karakterizasyonudur. Güvenle, kapasite kısmının ötesindeki tüm unsurları yok eder doğru değildir.

C ++ 'da, nesneler için dinamik olarak bellek kullanıldığında, iki adım vardır:

  1. Nesneler için bellek ayrılmıştır.
  2. Nesneler, bellek konumlarında başlatılır / oluşturulur.

Dinamik olarak ayrılan bellekteki nesneler silindiğinde, inşaat adımlarını yansıtan ancak ters sırada iki adım vardır:

  1. Bellek konumlarındaki nesneler tahrip olur (yerleşik tipler için bu bir nooptur).
  2. Nesneler tarafından kullanılan bellek yeniden yerleştirilir.

Kabın boyutunun ötesine ayrılan bellek sadece tampon bellektir . Doğru şekilde başlatılmış herhangi bir nesne tutmazlar. Bu sadece ham hafıza. shrink_to_fit()ek belleğin orada olmadığından, ancak bu konumlarda hiçbir nesnenin bulunmadığından emin olur. Bu nedenle, hiçbir şey yok edilmez, sadece bellek yeniden yerleştirilir.


2

C ++ Standardına göre shrink_to_fit

Efektler: shrink_to_fit, kapasiteyi () boyuta () düşürmek için bağlayıcı olmayan bir istektir.

ve göreceli olarak resize

Efektler: sz <size () ise, dizideki son boyut () - sz öğelerini siler. Aksi takdirde, sz - size () varsayılan olarak eklenen öğeleri diziye ekler.

Fonksiyonların farklı şeyler yaptığı açıktır. Üstelik birinci fonksiyonun parametresi yoktur, ikinci fonksiyonun iki parametresi bile vardır. shrink_to_fitBelleği yeniden tahsis edebilmesine rağmen işlev kabın boyutunu değiştirmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.