Скажем, у меня есть вектор, объявленный следующим образом:
struct MYSTRUCT
{
float a;
float b;
};
std::vector<MYSTRUCT> v;
Теперь я хочу найти все элементы v, которые имеют одно и то же a, и усреднить их b, т.е.
Скажем, v содержит эти пять элементов {a, b}: {1, 1}, {1, 2}, {2, 1}, {1, 3}, {2, 2}.
Я хочу получить v[0], v[1], v[3] (где a равно 1) и среднее значение b: (1 + 2 + 3)/3 = 2, а v[2] и v[4] (где a равно 2) и среднее значение b: (1+2)/2 = 1,5
После этого v будет выглядеть так: {1, 2}, {1, 2}, {2, 1.5}, {1, 2}, {2, 1.5}
Я не очень хорошо знаком с STL или Boost, поэтому я могу только понять, как это сделать «грубой силой» на C++, но я предполагаю, что библиотеки STL (for_each?) и Boost (лямбда?) могут решить эту проблему. более элегантно.
EDIT Просто для справки, вот мой (рабочий) способ грубой силы:
for(int j = 0; j < tempV.size(); j++)
{
MYSTRUCT v = tempV.at(j);
int matchesFound = 0;
for(int k = 0; k < tempV.size(); k++)
{
if(k != j && v.a == tempV.at(k).a)
{
v.b += tempV.at(k).b;
matchesFound++;
}
}
if(matchesFound > 0)
{
v.b = v.b/matchesFound;
}
finalV.push_back(v);
}