2013-04-10 5 views
1

Я использую импульсные аккумуляторы для получения статистики из вектора удвоений в C++. Каждый раз, когда мне нужна новая статистика, я вызываю собственный метод, который получает его, создавая накопитель, загружая его векторными значениями и, наконец, используя статистическую функцию boost, например.Использование и эффективность использования аккумулятора аккумулятора Boost

double Entity::min(void) { 
    accumulator_set< double, features<tag::min> > acc; 
    // Now load the vector into the accumulator. 
    acc = std::for_each(samples.begin(), samples.end(), acc); 
    // Specify namespace to avoid name clash of this min method 
    this->_min = boost::accumulators::min(acc); 
    return this->_min; 
} 
// etc. more methods for StdDev, mean, max etc. 

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

Спасибо, ребята

Пит

+0

является 'samples' атрибутом класса, обозначаемого' this'? – didierc

+0

Да didierc, samples является свойством класса Entity и определяется как вектор Pete855217

ответ

1

алгоритм вы используете работы по samples коллекции, которая является атрибутом класса Entity. Коллекция представляет собой экземпляр векторного шаблона.

Экземпляр std::for_each работает только на итераторах коллекции, которые принимаются во время строительства: samples.begin() и samples.end().

Стандартные итераторы специально разработаны для абстрагирования понятия курсора или указателя на коллекции. Они не дублируют коллекцию каким-либо образом, поэтому вам не стоит беспокоиться о проблемах с распределением памяти при их использовании.

Конкретный accumulator_set здесь также не производит копий коллекции. Он просто обращается к итератору, проводит сравнение между текущим мини-кандидатом и текущим указанным значением коллекции и сохраняет лучшее как для следующей, так и для итерации.

В его нынешнем виде ни одна из стандартных частей, которые вы используете, не дублирует коллекцию.

+0

Спасибо большое за подробный ответ - как я понимаю, итератор использует курсор и не выделяет больше памяти, чем требуется для этого курсора, когда он итерации вектора . Таким образом, влияние памяти невелико, однако для обработки значений требуется обработка. Еще раз спасибо Pete – Pete855217

+0

никаких проблем, учитывая природу кода, я думаю, вы знали почти все это, но я подумал, что было бы неплохо попытаться дать как можно больше деталей. Надеюсь, я не оставил никаких пробелов в своих объяснениях. – didierc

Смежные вопросы