Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2013, 21:05   #1
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию Заменить accumulate на count_if

Здравствуйте. Есть задача модифицировать вектор вещественных чисел, прибавив к каждому элементу среднее арифметическое его положительных элементов. Задача решена, однако преподаватель очень строг и любит погонять. В итоге придрался к коду. Вообщем, необходимо поменять оставшийся accumulate на count_if, однако я не понимаю смысла и не понимаю, как одно можно заменить другим. Помогите пожалуйста разобраться с этим вопросом, т.к. одногруппники говорят, что препод не просто так приелся.
Код:
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

bool IsPositive (double value){return value >= 0 ? true : false;}

int main()
{
	istream_iterator<double> cinIterator(cin);	// входной итератор
	istream_iterator<double> endOfStream;		// конечный итератор
	vector<double> numbers(cinIterator, endOfStream);
	vector<double> result;
	result.resize(numbers.size());

	int realNumbersCount = 0;
	double realNumbersSum = 0;

	realNumbersCount = count_if(numbers.begin(), numbers.end(), IsPositive);
	realNumbersSum = accumulate(numbers.begin(), numbers.end(), 0.0, [](double sum, double value){return value > 0 ? sum + value: sum;});

	if (realNumbersCount != 0)
	{
		double mean = 0;
		mean = realNumbersSum / realNumbersCount;
		//transform(numbers.begin(), numbers.end(), result.begin());
		for (size_t i = 0; i < numbers.size(); i++)
		{
			numbers[i] += mean;
		}
	}
	copy(numbers.begin(), numbers.end(), ostream_iterator<double>(cout, ", "));
	return 0;
}
Yoh вне форума Ответить с цитированием
Старый 11.12.2013, 21:40   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

хм ) ну первое, что приходит в голову - добавить подсчет суммы сайдэффектом в предикат, используемый в count_if.
Код:
bool IsPositive (double value)
{
	if (value > 0) {
		sum += value;
		return true;
	} else
		return false;
}
Теперь второй проход по циклу для подсчета уже не нужен.
Правда, если развивать эту идею дальше, количество и сумму нужно считать сразу при вводе, тогда становится еще одним циклом меньше...

P.S. Повезло тебе с преподом, обычно они весьма далеки от stl )
Son Of Pain вне форума Ответить с цитированием
Старый 11.12.2013, 23:17   #3
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

А переменная sum получается глобальной делать? Если нет, то извините, но не понятно, как обратиться к sum?
Yoh вне форума Ответить с цитированием
Старый 12.12.2013, 05:15   #4
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

Погуглил, незнаю, хорошо ли получилось, но чтобы не создавать глобальную переменную, замутил вот такую вот вещь. Если что то неправильно, поправьте пожалуйста:
Код:
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

bool IsPositive (double value, double & sum)
{
	if (value > 0) {
		sum += value;
		return true;
	} else
		return false;
}

int main()
{
	istream_iterator<double> cinIterator(cin);	// входной итератор
	istream_iterator<double> endOfStream;		// конечный итератор
	vector<double> numbers(cinIterator, endOfStream);
	vector<double> result;
	result.resize(numbers.size());

	int realNumbersCount = 0;
	double realNumbersSum = 0;

	realNumbersCount = count_if(numbers.begin(), numbers.end(),[&realNumbersSum](double value){return IsPositive(value, realNumbersSum);});

	if (realNumbersCount != 0)
	{
		double mean = 0;
		mean = realNumbersSum / realNumbersCount;
		transform(numbers.begin(), numbers.end(), result.begin(), [mean](double value){return value+mean;});
		copy(result.begin(), result.end(), ostream_iterator<double>(cout, ", "));
	}
	else
	{
		copy(numbers.begin(), numbers.end(), ostream_iterator<double>(cout, ", "));
	}
	return 0;
}
Yoh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заменить . на , sasha_prof Microsoft Office Word 4 23.07.2012 12:37
в массиве все максимальные элементы заменить первым элементом, а все минимальные элементы заменить последним элементом Валерия2701 Паскаль, Turbo Pascal, PascalABC.NET 1 12.10.2011 15:49
заменить Н/Д Iskin Microsoft Office Excel 3 30.12.2010 01:52
Заменить lubov_morkov Помощь студентам 4 07.02.2010 20:38
вычислить среднее гармоническое значение элементов вектора чисел с плав точкой с пом алгоритма accumulate -GT- Общие вопросы C/C++ 2 28.11.2009 17:19