Median z prvků celého kontejneru (šablona pro vector a pole) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Median z prvků celého kontejneru (šablona pro vector a pole) – C / C++ – Fórum – Programujte.comMedian z prvků celého kontejneru (šablona pro vector a pole) – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Longin0
Duch
6. 9. 2015   #1
-
0
-

Zdravím

Řeším cvičení z knížky Rozumíme C++ (Andrew Koenig, Barbara E. Moo) a to konkrétně kapitola 10 cvičení 10.2.

O  co jde?

Máme pomocí šablonové funkce napsanou funkci pro nalezení střední hodnoty z prvků kontejneru vector

template <class T>
T median(vector<T> v)
{
#ifdef _MSC_VER
        typedef typename std::vector<T>::size_type vec_sz;
#else
	typedef typename vector<T>::size_type vec_sz;
#endif

	vec_sz size = v.size();
	if (size == 0)
		throw domain_error("median of an empty vector");

	sort(v.begin(), v.end());

	vec_sz mid = size/2;

	return size % 2 == 0 ? (v[mid] + v[mid-1]) / 2 : v[mid];
}

Úkolem je tuto šablonu přepsat aby fungovala kromě vectoru i na Céčkovské pole.

Zkoušel jsem toto: udělat si lokální kopii kontejneru ohraničenou iterátory a a obdobným způsobem najít prostřední prvek.

template <class T, class Iterator>
T median(Iterator begin, Iterator end) {
  if (begin == end)
    throw domain_error("median of an empty container");
  vector<T> temp;
  for ( ; begin != end; ++begin)
    temp.push_back(*begin);
  sort(temp.begin(), temp.end());
  size_t mid = temp.size() / 2;
  T ret = (temp.size() % 2 == 0)
    ? (temp[mid] + temp[mid - 1]) / 2
    : temp[mid];
  return ret;
}


Tato šablona ale nefunguje protože při volání funkce kompilátor řve "no matching function"...

Mohl by mi někdo prosím poradit? Vygoogloval jsem řešení pomocí knihovny <array>, ale ta je součástí až C++11 verze.

Nahlásit jako SPAM
IP: 84.21.106.–
Řešení
Longin0
Duch
6. 9. 2015   #2
-
0
-
Vyřešeno Nejlepší odpověď

#1 Longin
aha, tak stačilo jenom si pročíst něco znovu o kapitole šablon...

Šablona je napsána správně, ale pokud v argumentech není jednoznačně určeny typy všech argumentů šablony, tak je ho třeba zpecifikovat při volání.

int pole [] = {1, 9, 2, 8, 3, 7, 5};
    vector<int> vec(pole, pole + 7);
    cout << median(pole, pole +7) << endl; //nefunguje
    cout << median<int>(pole, pole +7) << endl;
    cout << median<int>(vec.begin(), vec.end()) << endl;
Nahlásit jako SPAM
IP: 84.21.106.–
ondrej39+1
Věrný člen
6. 9. 2015   #3
-
0
-

#2 Longin
Jen pro zlepšení, nikdy nepoužívej takovéto konstanty, jako zde v kódu máš například sedmičku.

int velikostPole = sizeof(pole) / sizeof(int);
cout << median<int>(pole, pole + velikostPole);

Nejen že ti to bude fungovat i pokud do pole přidáš další prvky, ale člověk, který by eventuálně po tobě projekt převzal, ti bude určitě vděčný, protože kód lépe pochopí :).

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
vitamin+8
Grafoman
7. 9. 2015   #4
-
0
-

#2 Longin

Ta kniha ma 15 rokov, odvety sa schvalili 3 nove standrdy jazyka C++, konkretne c++03, c++11 a c++14.

Doporucujem aby si si nasiel novsiu knihu. V dnesnej dobe vobec nepotrebujes zadavat Iterator aj parameter T: 

template <class Iterator>
auto median(Iterator begin, Iterator end)->decltype(*begin){
    //...
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Longin0
Duch
7. 9. 2015   #5
-
0
-

#4 vitamin
bohužel v češtině nevím o žádné lepší knize. Zkoušel jsem ty dokola doporučované knihy jako je Mistrovství v C++, Myslíme v jazky C++ (Eckel), Naučte se C++ za 21 dní, ale nevyhovovaly mi (důraz na C styl na úkor OOP v C++, zastaralé). Na této vyjímečné knize se mi líbí, že používá od začátku STL. Bylo jí vytýkáno, že to není kniha pro začátečníky, což mě tolik nevadí, protože znám čisté C a OOP z Javy.

Snad nebude pro mě problém se pak doučit novinky z dalších standartů (např C+11 je v QT toolchainu a IDE, co používám, stále jako experimentální)

Nahlásit jako SPAM
IP: 84.21.106.–
vitamin+8
Grafoman
7. 9. 2015   #6
-
0
-

#5 Longin
Treba sa naucit citat odborny anglicky text, bez toho sa tak ci tak nepohes dalej. Ceske/Slovenske preklady su extremne zastarale a vecsinou zamerane len na zaciatocnikov. 

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Longin0
Duch
7. 9. 2015   #7
-
0
-

#6 vitamin
to není problém

dokonce se chystám na knihy od Scota Meyerse (Effective C++ atd)

Nahlásit jako SPAM
IP: 84.21.106.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 88 hostů

Moderátoři diskuze

 

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