#6 vitamin
to není problém
dokonce se chystám na knihy od Scota Meyerse (Effective C++ atd)
#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í)
#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;
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.
Zdravím
dělám takový program ve visual c++ studiu 2008 a už hodinu se vztekám nad tímto problémem
Mám char pole[20] a v GUI designeru TextBox. No a samozřejmě řeším jak C++ String z TextBoxu převést na to moje pole znaků. Proč nemůžu pracovat s objektovým stringem se prosím neptejte, protože výuka u nás (nechápu proč) je klasické C a GUI si klikáme v designeru.
Přes různý c_str() toCharArray() apod C++ funkce jsem se k ničemu nedokopal, jelikož moje znalosti OOP C++ jsou nulové.
Naposledy jsem se doogugloval k tomuhle a nepomohlo :(
strcpy(pole,System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(this->TB_jmeno->Text));
Jestli mi někdo pomůže, tak budu moc rád