Tam Sürümünü Görmek İçin : list-vector
herkese merhabalar...
sik bicimde,std::vector tipindeki depolayicimizin elemanlari arasina yeni elemanlar yerlestirip/cikarmak gerektiginde, dogaldir ki bu hiz acisindan pahali bir islem olacaktir.
Acaba, bu vektore erisebilen 'p' gibi bir isaretcimiz varsa, v adindaki vektorunde elemanlarinin icerigini cok sik olarak ,su sekilde "sadece degistirmek" istiyorsam :
p = v.begin()+n;
*p = baskaBirDeger_;
bana pahaliya mal olur mu? std::list kullansam daha mi kullanislidir ?
acehreli
07/12/2004, 08:06
Oncelikle bu hiz kaygisini bir kenara birakmalisin. std::vector'un icine kendi programindaki veri yapilarini koyup denemeden bilemezsin.
vector (ve diger standart topluluklar) nesnelerini kopyalayarak tutarlar. Onun icin, dedigin gibi, kopyalanmasi pahali olan bir turu tutmak icin vector<BirTur> yerine vector<BirTur*> kullanmak daha hizli olur. Cunku bu durumda vector'un nesnelerinin turu gostergedir ve gostergeleri kopyalamak cok ucuzdur.
Ama bu sefer de yasam surecleri ile ilgili sorunlarla ugrasmak zorunda kalabiliriz. Eger vector zaten var olan nesnelere gosterge tutacaksa, o nesneleri var etmek ve yok etmek kimin sorumlulugu olacaktir?
Bu sorundan da kurtulmak icin yine cozum, vector<AkilliGosterge<BirTur> > kullanmak olabilir.
Benim onerim:
1) Oncelikle vector<BirTur>
2) Eger bu kullanim gercekten programi yavaslatiyorsa (emin olmak icin mutlaka deneyin!), ve nesneler vector tarafindan sahipleniliyorlarsa, vector<AkilliGosterge<BirTur> >
3) Nesnelerin yasam surecleri baska sekilde hallediliyorsa ve vector yalnizca onlari gostermek icin kullaniliyorsa vector<BirTur const *>
4) Eger nesneleri vector yoluyla eriserek degistireceksek vector<BirTur *>
vector o kadar iyi calisir ki, 'reserve' islevinin kullanilmasi bile cogu programda gereksizdir. Bjarne Stroustrup'un ve Herb Sutter'in daha onceden okudugum yazilarina guvenerek oncelikle vector kullanilmasini oneririm.
Aslinda Herb Sutter bir donem deque'in daha etkin oldugunu ileri surmus (dogrudur!) ve oncelikle deque'in kullanilmasini yaymaya calismistir ama daha sonradan o da bundan vazgecmistir.
Yani, vector<BirTur> :)
Ali
acehreli
07/12/2004, 08:28
ceeyt, mektubunu cok iyi okumadigimi farkettim. Eger nesneler aralara girip cikartilacaklarsa vector bu ise uygun degildir. Nesnelerin nerelere gireceklerini nasil belirleyeceksin? Yani sirali mi olmalari gerekiyor? Eger oyleyse std::set veya std::map kullanabilirsin.
Eger sIk olarak "sadece degistirmek" istiyorsan, bir sey farkedecegini sanmiyorum. Hangi topluluk olursa olsun, sonucta var olan bir nesneye atama yapiliyor olacaktir.
Baska kistaslar da var: rastgele erisim gerekiyor mu? list kullanildiginda nesnelere hep bastan baslayip ilerleyerek erisebilirsin.
Ne olursa olsun, bence denemeden bilemezsin... Belki de biraz daha fazla bilgi vermelisin; belki daha uygun topluluklar da vardir...
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.