Лучшие практики: Как улучшить этот код, который суммирует значения контейнера? - PullRequest
2 голосов
/ 29 ноября 2010

Я пишу простую функцию, которая перебирает числа в контейнере и вычисляет некоторое суммирующее значение (в данном случае энтропию).

Я хочу написать его как можно более универсальным, чтобы он работалс разными контейнерами (vector, set, ...) для разных типов значений (double, float, ...), поэтому я делаю это:

template<class Iterator>
typename Iterator::value_type Entropy(Iterator begin, Iterator end) {
  typedef typename Iterator::value_type Value;
  Value result = Value(); // assignment needed?
  for (Iterator it = begin; it != end; ++it) {
    result -= *it * log(*it);
  }
  return result;
}

Меня интересует, как будет выглядеть этот код в соответствии со всеми лучшими практиками.Другими словами, как именно будет выглядеть STL-реализация этой маленькой функции?

Ответы [ 4 ]

4 голосов
/ 29 ноября 2010

В C ++ 0x может использоваться следующая лямбда-версия:

template<class Iterator>
typename Iterator::value_type Entropy(Iterator begin, Iterator end) {
  typedef typename Iterator::value_type Value;
  return accumulate(begin, end, Value(), 
      [] (Value i, Value j)-> Value { return i - j * log(j); });  
}
4 голосов
/ 29 ноября 2010
template < typename T1, typename T2 >
T1 entropy_sum(T1 sum_so_far, T2 number)
{
  return sum_so_far - static_cast<T1>(number) * log(static_cast<T1>(number));
}
double entropy = std::accumulate(set.begin(), set.end(), 0.0, &entropy_sum<double, set_type::value_type>);

Ваш метод в порядке, за исключением того факта, что Value() не может быть юридическим утверждением.

Отредактировано для отражения комментария.

4 голосов
/ 29 ноября 2010

посмотрите в std :: transform и std :: аккумулировать

2 голосов
/ 29 ноября 2010

Было бы лучше использовать std::iterator_traits для этого:

typedef typename std::iterator_traits<Iterator>::value_type Value;

Это позволяет Iterator быть указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...