Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Tolik rozruchu
jen v Lopuchu

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.
Archiv

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: fvoeaod
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
huh huh 8.6.2010 07:11  824
ŘešeníPokud jste nečetli zadání, tak je zde, prosím přečtěte si ho a zkuste vyřešit.
Moje řešení následuje, netvrdím, že je jediné či nejlepší (vyberte myší text pro zobrazení):
*back_inserter(v) = *istream_iterator<int>(cin);
Pokud by mělo být opravdu použitelné, bylo by potřeba si napsat vlastní istream_iterator, který vyhodí výjimku, pokud dojde při čtení k chybě, takhle to buď načte nesmysl nebo udělá chaos :-)

huh huh 4.6.2010 20:12  823
Tak jistě, v tom je ta záludnost, jinak by stačilo cin >> v[0];
bredy 4.6.2010 20:03  822
No vzhledem k tomu, že neznám STL z paměti, tak tohle nevím. Napadlo mne použití cin >> *v.begin(), ale problémem je pro mě nejprve vyrobit ten první prvek ve vektoru v, protože v.begin() jinak ukazuje na end()
huh huh 4.6.2010 19:03  821
Pokud chcete hádanky, dám vám taky jednu. Mějme
using namespace std;
vector<int> v;
Načtěte číslo z cin do v jediném příkazu (neobsahujícím operátor čárka ☺), bez použití pojmenované proměnné. Předpokládejte, že čtení se vždy podaří (tj. program se nemusí chovat korektně, pokud ne). Můžete použít cokoli (třídu, funkci, makro ...) z libovolného standardního (ISO C++ 98) hlavičkového souboru.
bredy 1.6.2010 12:54  820
Chtěl jsem si založit blog na Rootu, s tím, že tam budu posílat své články o C++. Root ma ale blogy momentálně zablokované (jejich zakládání), takže smůla. Prvním článkem měl být článek o seznam typu. Tak zatím zůstává na mém blogu

Seznamy typů a jejich použití
bredy 31.5.2010 13:00  819
Och, opravuju chybu "vysí" na "visí"
davpe Davpe 31.5.2010 12:59  818
hmm, ja tipoval ze WCKB znamena "Wo co kurva běží?" Ale určitě to sem dávej.
bredy 31.5.2010 12:49  817
Pokud bude zájem a budou se podobné úlohy objevovat na WCKB u nás v Seznamu, mohu to sem postovat. (WCKB = WC Knowledge Base, čili úryvky objevující se na toaletach). Druhým WCKB je spíš apel na programátory ve znění

I ty můžeš používat const


(vysí to na velké toaletě hned vedle podobného zvolání ohledně splachování a štětky).

Další WCKB bude zřejmě koncem června
bredy 31.5.2010 12:45  816
huhPřesně tak. A to tento příklad neřeší výjimku v destruktoru, předpokládá se, že nevznikne.
huh huh 31.5.2010 12:41  815
Bredy [812]: Jen si tak tipnu bez nahlížení do chytrých knih :-)
když selže
druhy(new Druhy_t())
(tj. vyhodí výjimku - buď new nebo něco v konstruktoru Druhy_t), tak vznikne memory leak, protože prvni už je alokována.
bredy 31.5.2010 09:43  814
StinnyNení to úplně přesně ono. V zásadě se stačí držet toho co tam je. Dejme tomu, že kopírovací konstruktory a operátory se buď neřeší, nebo se řeší jejich zakázáním, ... asi by stálo za to tam uvést, ale tam problém nevězí.
stinny 31.5.2010 09:13  813
BredyO dvojitou dealokaci pri copy constructoru nebo operatoru =
bredy 31.5.2010 07:51  812
WCKB ze Seznamu
class OCoSiKoleduju_t {
public:
    OCoSiKoleduju_t()
        : prvni(new Prvni_t()),
          druhy(new Druhy_t())
    {}

    ~OCoSiKoleduju_t() {
        delete druhy;
        delete prvni;
    }

private:
    Prvni_t *prvni;
    Druhy_t *druhy;
};


Ví někdo řešení?
sekory Sekory The journey of thousand miles - starts with a single step. 8.3.2010 15:00  811
C++ za 21 dní :-)
bredy 1.3.2010 19:45  810
DavpeNikoliv. Alokátor je objekt, který se jednoduše stará o alokace. Jeho využití je zejména u kontejnerů, kterým lze ovlivnit způsob, jak se budou alokovat prvky, nebo interní struktury kontejneru. Příklad: std::allocator

Já mám ve své knihovně dvoustupňové allokátory. První stupeň je StdAlloc, který je továrnou pro tzv. StdAllocBlock. Tenhle objekt obsahuje ukazatel na alokovaný prostor a jeho velikost. Tenhle blok lze předat třeba do AutoArray (něco jako vector) a v něm pak ten objekt alokuje. Tenhle druhý stupeň alokátoru se umí i relokovat a má tu vlastnost, že sám v destruktoru volá delete.

Mezi dalšími alokátory mám třeba StaticAlloc<n> který dělá podobnou věc jako StdAlloc, akorát alokuje vždy statické pole dané velikosti (n). Když to vrazíš do AutoArray, tak uděláš to, co s vektorem nikdy. Kontejner bude ve svým těle obsahovat rezervovaný prostor pro n prvků, ale dál se bude chovat jako rozšiřovatelné pole (až do velikosti n). Odpadne tak jedno zbytečný new a delete.

Ale abych to shrnul. Alokatorem obecně nazýváme objekt, který má na starost přidělování a uvolňování paměti. Poskytujeme ho kontejnerům, nebo dalším objektům, které něco musí alokovat. V šablonách je pak výhodou to, že můžeme kontejneru podstrčit alokátor, který třeba nealokuje paměť fyzicky, ale alokace nějakým způsobem emuluje. Nebo alokuje ve speciální haldě, třeba ve sdílené paměti.

[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt