Ponad to co napisał @twonek
- Nie przeładowujesz
what
. Przesłaniasz je. std::exception::what()
przyjmuje const this
oraz jest noexcept
, co by Ci kompilator powiedział gdybyś wyraził swoje intencje jasno poprzez override
- Przekazujesz iterator w celu wyłuskania jego wartości bez żadnego sprawdzania. Dlaczego nie przyjmiesz po prostu
int
? Albo odwrotnie - przynajmniej pary iteratorów, abyś mógł powiedzieć, który to element zamiast jego wartości?
- Nie używaj
std::list
o ile benchmarki wyraźnie nie potwierdzą, że to lepsze rozwiązanie od std::vector
. std::vector
to bardzo dobry default.
rodzaj = "malejacy"
poczytaj o takim słówku kluczowym enum
. To jest ohydne.
5. Cały ten kod można zamienić na std::is_sorted_until
.
Masz tutaj lepszy kod. Wciąż nie jest idealny, ale lepszy:
template<template<class, class> class Container, typename T, typename U>
auto better_sum(Container<T,U> const& c)
{
if(c.size() <= 2){
return accumulate(c.cbegin(), c.cend(), T{});
}
auto const& first = *c.cbegin();
auto const& second = *std::next(c.cbegin());
function_ptr<bool(T const&, T const&)> compare =
first > second ? [](T const& l, T const& r){ return l > r; } :
first == second ? [](T const& l, T const& r){ return l == r; } :
[](T const& l, T const& r){ return l < r; };
auto it = is_sorted_until(c.cbegin(), c.cend(), compare);
if(it != c.cend()){
throw MonotoneException(*it);
}
return std::accumulate(c.begin(), c.cend(), T{});
}
http://melpon.org/wandbox/permlink/qYptq5ecmY5zuqyl