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.