.[ ČeskéHry.cz ].
Převod INT na STRING
Jdi na stránku Předchozí  1, 2
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 25. prosinec 2007, 15:18:23    Předmět: Odpovědět s citátem

k tematu:

kraticky priklad a vysvetleni pomoci iostream zde:

http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

rezna napsal:

mno ono zalezi jestli chces prevest jenom int-to-string a nebo chces ten int naformatovat nekam doprostred stringu

pokud chces to prvni pak OK

ale pokud nekdo chce vypsat treba
"Vase skore je 50."
tak je s(n)printf() tisickrat vhodnejsi, protoze v tomhle pripade psat kod

kód:
vypis("Vase skore je ");
str = preved_int_na_string(50);
vypis(str);
vypis(".");


je a) neprehledny b) nutne pomaly

a to nedejboze jestli to nebude jeste takto
kód:
str = "Vase skore je ";
str += itoa(50);
str += ".";
vypis(str);


kde se treba nutne budou kopirovat (nebo minimalne reallocovat) buffery. to je uplna silenost

nutne tedy vitezi ten sprintf() ktery je elegantni.


ad a) std::string str a = "Vase skore je " + stringify(50) + "."; je neprehledne?

ad b) std::string ne vzdy pri pouziti +, +=, append() realokuje a kopiruje pamet. Viz STL dokumentace a metoda capacity() - konkretni implementace se odviji od verze STL ("grow policy" neni vyhradne urcena standardem).

Pozn: pozor, netvrdim ze pouziti printf() je vzdy spatne..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 26. prosinec 2007, 06:54:32    Předmět: Odpovědět s citátem

Když už se tady bavíte o rychlosti...

Kdyby někomu vadilo, že se string realokuje, dá se použít jeho metoda reserve a tím tomu zamezit. Nutno podotknout, že string má hodně podobný vlastnosti jako vector<char> a tedy operátor += je rychlejší než + (podobně jako push_back oproti kopii celého vectoru). BTW zkoušel jsem na VC++ otestovat rychlost string::operator+=(const char*) vs ostringstream::operator<<(const char*) a jako rychlejší mi vyšel string.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 26. prosinec 2007, 10:11:39    Předmět: Odpovědět s citátem

quas4 napsal:
ad a) std::string str a = "Vase skore je " + stringify(50) + "."; je neprehledne?


ano prijde mi to dostatecne neprehledne a za mnohem vice prehledne povazuji .NETove String.Format() ktere jsem si jeste upravil pro svuj projekt v COMu jako

FormatTextByTemplate("Vase skore je {skore}.", "skore", 50);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 26. prosinec 2007, 10:13:44    Předmět: Odpovědět s citátem

Eosie napsal:
Když už se tady bavíte o rychlosti...


na rychlost je samozrejme nejvhodnejsi trida podobna .NETovemu StringBuilderu - tedy neco co neni optimalizovane na samotnou praci se stringem, ale na buildovani delsich retezcu
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 27. prosinec 2007, 07:48:05    Předmět: Odpovědět s citátem

StringBuilder tam je proto, že stringy jsou immutable, tzn. jejich spojování je pomalé - vyžaduje opakované vytváření a kopírování stringu. (čerpám z toho, co vím z Javy) Jenomže v C++ jsou mutable a tedy samotná třída je už optimalizovaná pro editaci. Zkusil jsem udělat nějaké testy a string+= společně s reserve je fakt hodně rychlý, skoro jako char* (a to se ještě nesmí použít strlen, aby char* nebyl v nevýhodě, protože string::length má složitost O(1)).
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 27. prosinec 2007, 09:46:30    Předmět: Odpovědět s citátem

eosie: OK - je fakt ze nejvice pracuju s BSTR ktery prave trpi stejnym problemem jako String v .NETu, tedy pro spojovani se vzdy musi alokovat a to presne.

na druhou stranu maji tu vyhodu v rychlem strlen() resp. ::SysStringLen()
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2
Strana 2 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna