abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 1
dnes 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 2
dnes 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 0
dnes 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
dnes 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
dnes 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
včera 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
včera 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
včera 15:16 | Komunita

Na GOG.com začal zimní výprodej. Řada zlevněných her běží oficiálně také na Linuxu. Hru Neverwinter Nights Diamond lze dva dny získat zdarma. Hra dle stránek GOG.com na Linuxu neběží. Pomocí návodu ji lze ale rozběhnout také na Linuxu [Gaming On Linux].

Ladislav Hagara | Komentářů: 1
včera 13:14 | Bezpečnostní upozornění

Byla vydána verze 2.7.1 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Řešeno je několik bezpečnostních problémů. Aktualizován byl především Tor Browser na verzi 6.0.7. Tor Browser je postaven na Firefoxu ESR (Extended Support Release) a právě ve Firefoxu byla nalezena a opravena vážná bezpečnostní chyba MFSA 2016-92 (CVE-2016-9079, Firefox SVG Animation

… více »
Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 759 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: C++ iterator

Jardík avatar 2.11.2009 10:48 Jardík | skóre: 40 | blog: jarda_bloguje
C++ iterator
Přečteno: 673×
Zdravím, mám takový problémek.

Mám nějakou třídu/šablonu (např kontejner) a v té mám deklarovány další 2 - iterátory (iterator a const_iterator).

Pak mám v té šabloně STL-like metody, které vrací iterátory
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
Když pak chci použít begin() vracející const_iterator, tak mi GCC řve, že iterator nelze převést na const_iterator
kontejner<int> k;
k.insert(50);
k.insert(60);

for (kontejner<int>::const_iterator it = k.begin(); it != k.end(); ++it)
{
  // něco
}
MSVC hlásí ambigous call (nebo tak něco).

Dovolil jsem se kouknout do hlavičkového souboru STL a tam je něco podobného, co mám já a tam si kompilátor při použití const_iterator nestěžuje, např. u setu:
set<int> k;
k.insert(50);

for (set<int>::const_iterator it = k.begin(); it != k.end(); ++it)
{
  // něco
}
Proč? Proč mu vadí vlastně napsaný a ten v STL mu nevadí, vždyť to je snad to samý ... nebo jsem úplně blbej.
Věřím v jednoho Boha.

Řešení dotazu:


Odpovědi

stativ avatar 2.11.2009 11:01 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: C++ iterator
Netuším, jak jsou ty iterátory napsané, ale pokud nejsou ve vztahu dědičnosti, tak budeš muset nejspíš napsat nějaký konstruktor, který provede konverzi.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
2.11.2009 11:32 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator
Tak, jak to máte napsané, by to mělo fungovat. Asi bude potřeba vidět celý ten hlavičový soubor nebo z něj vyrobit minimální testcase, kde to při překladu zlobí.
Jardík avatar 2.11.2009 11:51 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: C++ iterator
Příloha:
Tady je zdroják.
Věřím v jednoho Boha.
2.11.2009 12:53 volca
Rozbalit Rozbalit vše Re: C++ iterator
Coz takhle udelat v const_iterator konstruktor z iterator instance?
2.11.2009 12:58 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator
To by samozřejmě pomohlo, ale je to řešení tak trochu postavené na hlavu. Mimo jiné se pak verze begin() vracející const_iterator stane zbytečnou (protože se použije ta druhá).
2.11.2009 14:23 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: C++ iterator

To neni tak uplne pravda, verze vracejici const_iterator je deklarovana jako const, takze bude pouzita u konstatniho kontejneru.

2.11.2009 14:27 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator
To je sice pravda, ale u konstantního kontejneru problém, o kterém je tu řeč, především vůbec nenastane, takže tam tento trik není potřeba.
Jardík avatar 2.11.2009 14:41 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: C++ iterator
Takže taky je to pro vás záhada, že to nefunguje? Já na to čučím celý den a né a né na to přijít ...
Věřím v jednoho Boha.
2.11.2009 14:58 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator
Bohužel to nejspíš jinak nepůjde, C++ totiž neumožňuje mít dvě verze funkce/metody, které by se lišily jen návratovým typem a vybíralo se mezi nimi podle toho, co s návratovou hodnotou uděláte. Tady to projde jen proto, že jedna begin() je const a druhá ne. Jakmile to const odstraníte, překladač vám vynadá, že to nejde overloadnout.
Jardík avatar 2.11.2009 15:16 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: C++ iterator
No já tam mám const a přiřazuju to do const_iterator... Jak je možné, že když použiju např. set z STL, tak to funguje, když to v podstatě dělá to samé?
Věřím v jednoho Boha.
2.11.2009 15:20 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator
Funguje to v tom smyslu, že se použije verze vracející iterator a ten se následně automaticky přetypuje na const_iterator. V tomhle smyslu vám to bude fungovat taky, pokud to přetypování umožníte.
2.11.2009 15:22 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: C++ iterator

Muzete si vynutit zavolani const metody. Nekam pred cyklus dejte const kontejner<int>& ck = k; a pak piste nasledujici:

for (kontejner<int>::const_iterator it = ck.begin(); it != ck.end(); ++it)

Uprime receno nevim, cemu se s panem Kubeckem divite, takhle se to normalne dela a ve standardu je u kontejneru receno, ze iterator musi byt konvertibilni na const_iterator.

2.11.2009 17:44 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator
Já se ničemu nedivím, jen se snažím jít víc do hloubky.
2.11.2009 15:28 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: C++ iterator

Predevsim, pokud by verze s const byla (po pridani konverze interator -> const_iterator) zbytecna, tak byste ji mohl odstranit. Jenze kdyz tam nebude, tak si na konstatnim kontejneru nezavolate metodu begin(), coz je, jak jiste uznate, u kontejneru nikoliv zanedbatelny nedostatek. Ergo zbytecna neni.

2.11.2009 17:36 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator
Opravdu skvělá diskusní technika, reagovat zcela mimo kontext příspěvku, na který odpovídáte. :-)
2.11.2009 18:42 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: C++ iterator

Tak to jsem se asi prehledl. Jaky ze byl ten kontext, ve kterem normalni kontejner nepotrebuje konstatni begin() metody?

Kdyz uz jsme se tak pekne rozhovorili... z tonu vaseho prispevku mam pocit, ze znate nejake reseni, ktere neni postavene na hlavu a ve kterem se begin() const nestane zbytecnym. Mohl byste alespon naznacit?

2.11.2009 19:51 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator
Při daných omezeních jazyka (nemožnost overloadovat na základě návratového typu) mi jako nejčistší řešení připadá použití cbegin() a cend(), které jsou AFAIK součástí návrhu C++0x.
2.11.2009 20:30 Jirka P
Rozbalit Rozbalit vše Re: C++ iterator

A čemu tím v daném případě pomůžete? cbegin() a cend() má pomoci tam, kde typ iterátoru není znám (tzn. v parametrech šablonových funkcí a auto proměnných), ale to tady nenastává. Tzn. s cbegin můžu napsat:

std::search(cow_sequence.cbegin(), cow_sequence.cend(), // kompilátore, tady nedělej kopii COW sekvence
  needle.begin(), needle.end());
Místo abych psal ekvivalentní
std::search(const_cast<const COW_SEQ&>(cow_sequence).begin(), const_cast<const COW_SEQ&>(cow_sequence).end(), // kompilátore, tady nedělej kopii COW sekvence
  needle.begin(), needle.end());

MMCH, v C++ lze v jistém smyslu overloadovat podle návratového typu

3.11.2009 17:49 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: C++ iterator

No vidite, to neni spatny napad. Na druhou stranu, pokud tomu vytvoru budete chtit rikat kontejner a povolit jeho obecnejsi vyuziti, tak se reseni s konstruktorem nevyhnete. Konec koncu, v navrhu C++0x pozadavek na existenci konverze z iterator na const_iterator zustava.

Jardík avatar 3.11.2009 17:46 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: C++ iterator
Tak jako vždy jsem mimo. Tak se zdá, že set<> v STL v GCC má iterator i const_iterator prakticky stejný, protože ani v jednom případě nelze hodnota pak modifikovat (asi je to dáno tím, že je to seřazené). Takže tam hodím typedef a kadím na to :-)
Věřím v jednoho Boha.
3.11.2009 17:59 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C++ iterator

Vysvětlení je asi v této části hlavičkového souboru:

      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // DR 103. set::iterator is required to be modifiable,
      // but this allows modification of keys.
      typedef typename _Rep_type::const_iterator            iterator;
      typedef typename _Rep_type::const_iterator            const_iterator;

Chápu-li to dobře, jde o workaround na známou chybu gcc implementace standardní C++ knihovny.

3.11.2009 18:09 Jirka P
Rozbalit Rozbalit vše Re: C++ iterator
Ne, jde o workaround (resp. řešení) defektu ve specifikaci standardní knihovny C++. Viz http://open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#103
3.11.2009 18:17 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: C++ iterator

Are Set Iterators Mutable or Immutable?

Mimochodem, v puvodni STL od SGI byly const_iterator a iterator pro set (a dalsi "Simple Associative Container") zadefinovany jako identickeho typu.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.