Örvitinn

C++ vector notaður sem buffer

C++ forritarar þurfa að temja sér að nota STL safnið. Það samanstendur af gagnaklösum, algórithum og ýmsu dóti. Þar eru t.d. iostream klasarnir, string klasinn, exceptions og margt fleira.

Eitt af því sem margir lenda í vandræðum með STL er að þegar maður þarf að nota stýrikerfisföll er ekki hægt að senda STL gagnaklasana beint í þau. Yfirleitt er þetta þó lítið mál, þar sem beðið er um char* getur maður t.d. notað c_str() member fallið á std::string klasanum.

Það er ansi algengt að maður þurfi að lesa gögn inn í array. Í C++ detta menn þá oft í það að nota C aðferðir, skilgreina char array og afrita svo gögnin yfir í annan gagnaklasa. Þetta er í lagi meðan gögnin eru lítil og hægt er að geyma gögnin á hlaða en þegar það þarf að new/malloca minninu er hættan á minnisleka töluverð.

Í stað þess að notað char* og svoleiðis viðbjóð er málið náttúrulega að nota std::vector, það er auðveldara en það lítur út fyrir!

std::vector<char> buffer(4096); // 1
int res = read(&buffer[0], buffer.size()); // 2
buffer.resize(res); // 3
Maður byrjar (1) á því að búa til vector sem hefur í þessu tilviki pláss fyrir 4096 stök, því næst vísa ég á fremsta stak vectorsins (2), C++ staðallinn tryggir að gögnin í vector eru alltaf í samliggjandi minni. Að lokum er nauðsynlegt að kalla á resize() fallið á vectorinn (3). Þetta er gert til þess að staðan í vectornum sé rétt þannig að t.d. size() member fallið skili réttu gildi, jafnvel þó res væri 4096 í þessu tilviki þarf að kalla á resize.

Ekki þarf að hugsa um að eyða gögnunum í vectornum, því vectorinn sér um að eyða þeim þegar hann eyðist. Ef þú ert að forrita í C++ hefur þú enga afsökun til að gera char* buffer = new char[4096]; framar.

Ah, gaman að skrifa eitthvað sem allir fíla :-P

c++
Athugasemdir

JBJ - 11/11/03 22:07 #

Hrmpf... STL er ekki ofarlega á mínum vinsældalistum.

Sem betur fer er C/C++ á hröðu undanhaldi í því sem ég er að stússast í

Matti Á. - 11/11/03 22:26 #

Hvaða vitleysa, C++ og STL eru yndisleg tól, þú hefur bara lent í þeim á slæmum degi :-)

Ósk - 12/11/03 13:20 #

Það getur tekið dálítinn tíma að venjast því að nota STL, en um leið og fólk er búið að ná tökum á þessu er þetta algjörlega ómissanlegt.

Matti Á. - 12/11/03 19:18 #

STL er kannski frekar "óvenjulegt" safn. Í fyrsta lagi er það ekki hlutbundið, þó ýmsir klasar séu þarna. Erfðir eru einungis notaðar í villuklösum (exceptions) og iostream klösunum.

Þetta er aftur á móti generískur kóði með template stuðningi, þannig að generíkin!! er fengin í á compile tíma en ekki keyrslutíma sem skilar sér í miklum hraða.

STL kóði er stundum frekar ljótur, en þar sem velja þurfti milli fegurðar og hraða var hraði alltaf valinn! Ég kem með eitthvað fallegt dæmi bráðlega :-)