Anonymní profil PiranhaGreg – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil PiranhaGreg – Programujte.comAnonymní profil PiranhaGreg – Programujte.com

 

Příspěvky odeslané z IP adresy 109.81.210.–

PiranhaGreg
C / C++ › c++ kopírování dyn. pole obj…
9. 2. 2015   #199014

#29 KIIV
jop, taky jsem na to před chvílí ze zvědavosti koukl. Každopádně bych nechtěl dělat na standardních knihovnách ani náhodou. Nedávno jsem třeba koukal na implementaci Cčkové funkce strlen. Člověk by čekal nějakej while na 2 řádky a prý teda ne...

http://www.stdlib.net/~colmmacc/strlen.c.html

PiranhaGreg
C / C++ › c++ kopírování dyn. pole obj…
8. 2. 2015   #199011

#27 ondrej39
ČVUT FIT, je to tu těžký no :D. Už mám poslední pokus :-/.

Nechtějí napsat celý kód. Třeba je v zadání ať naimplementuji pouze insert. A s těmi kombinacemi právě ještě dost bojuju. Ze stromových struktur tam může být AVL tree, RB tree, B-stromy, pak různý kombinace n-árních stromů, ty binomiální a Fibonacciho haldy, pak samozřejmě klasika BVS a využití haldy v heap sortu... a když má člověk u každýho umět insert, delete, atd. tak je to šíleně kombinací... asi to nedám :D.

Ale jsou tam i lehčí příklady, na kterých snad naženu co nejvíc bodů O:-).

PiranhaGreg
C / C++ › c++ kopírování dyn. pole obj…
8. 2. 2015   #199007

#24 ondrej39
Těžko říct co bereš jako optimalizaci na vyšší programátorské úrovni. Realloc je dost standardní část Cčka a v C++ není jen z důvodu, že by prostě s konceptem tříd nemohl existovat. Jsou tam např. virtuální třídy, kde si kompilátor ukládá nějaký data i bokem mimo třídu a při takovémto přímém kopírování paměti by to na 100% nepřežili.

Já třeba zítra na VŠ skládám zkoušku z efektivních algoritmů. Musím umět během chvíle naimplementovat docela pokročilé datové struktury jako Red–black tree, Binomiální haldu, všechny možný řadící algoritmy, hashovací tabulky a spoustu dalších stromových struktur + určit složitost. To je pak psaní v Cčku docela oddychovka :-).

PiranhaGreg
C / C++ › c++ kopírování dyn. pole obj…
8. 2. 2015   #199002

#19 ondrej39
new [] by měl být stejně výkonný jako malloc. Rozdíl se projeví až právě při realokaci paměti. Zatímco při zvětšování pole alokovaného s new [] musíš všechny prvky zkopírovat do nového pole a staré pak uvolnit, realloc se ti pokusí staré pole zachovat a jen ho protáhnout. Taková operace tě pak i s milionem prvků nestojí téměř žádný čas. Ale není to garantovaný. Někdy se realloc tomu kopírování taky nevyhne...

PiranhaGreg
C / C++ › c++ kopírování dyn. pole obj…
8. 2. 2015   #198997

Tak ona se v C++ už celkově manuální alokace paměti téměř nepoužívá...

PiranhaGreg
C / C++ › c++ kopírování dyn. pole obj…
8. 2. 2015   #198993

No pořád se jedná o pole zaměstnanců s pomocnou proměnnou udávající jeho velikost a jeho aktuální naplněnost. Že je celý kód zabalený do třídy Zaměstnanci nic na principu dynamického zvětšování pole, tak jak jsem ho tam napsal, nemění.

PiranhaGreg
C / C++ › c++ kopírování dyn. pole obj…
8. 2. 2015   #198991

#10 ondrej39
Jestli je to ve třídě nebo mimo je celkem jedno. Princip zůstává stejný.

PiranhaGreg
C / C++ › ASCII Art
8. 2. 2015   #198989

To mi připomnělo můj pokus v ncurses asi půl roku zpět

https://www.facebook.com/groups/343257012467087/permalink/523249381134515

Myslím, že s vykreslováním obrázků v konzoli se ještě nikdo tak daleko nedostal  

PiranhaGreg
C / C++ › c++ kopírování dyn. pole obj…
8. 2. 2015   #198988

Ten kód není zrovna ukázkovej... Když už, tak aspoň takto 

#include <iostream>
#include <string>

using namespace std;

class Zamestnanec {
	string jmeno, prijmeni;
	int vek;

public:
	Zamestnanec() {}
	Zamestnanec(const string & jmeno, const string & prijmeni, int vek)
		: jmeno(jmeno), prijmeni(prijmeni), vek(vek) {}

	friend ostream & operator<<(ostream & os, const Zamestnanec & zamestnanec) {
		return os << zamestnanec.jmeno << ' ' 
			<< zamestnanec.prijmeni << " ("
			<< zamestnanec.vek << ')';
	}
};

class Zamestnanci {
	size_t pocet, velikost;
	Zamestnanec * zamestnanci;

public:
	Zamestnanci() : pocet(0), velikost(8), zamestnanci(new Zamestnanec[velikost]) {}
	~Zamestnanci() { delete[] zamestnanci; }

	size_t Pocet() const { return pocet; }

	Zamestnanci & operator+=(const Zamestnanec & zamestnanec) {
		if (pocet >= velikost) {
			velikost *= 2;
			Zamestnanec * pom = new Zamestnanec[velikost];

			for(size_t i = 0; i < pocet; i++)
				pom[i] = zamestnanci[i];

			delete[] zamestnanci;
			zamestnanci = pom;
		}

		zamestnanci[pocet++] = zamestnanec;
		return *this;
	}

	friend ostream & operator<<(ostream & os, const Zamestnanci & zamestnanci) {
		for (size_t i = 0; i < zamestnanci.pocet; i++)
			os << zamestnanci.zamestnanci[i] << endl;

		return os;
	}
};

int main(void) {
	Zamestnanci zamestnanci;

	zamestnanci += Zamestnanec("Jan", "Novák", 27);
	zamestnanci += Zamestnanec("Franta", "Vomáčka", 22);

	cout << zamestnanci;
}

Ale pořád tam samozřejmě chybí tuna věcí...

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý