编辑:一次通过的地图累加器 - result2
包含您需要的信息:
#include <map>
#include <algorithm>
#include <numeric>
typedef map<const unsigned int, unsigned int> Values;
struct averageMap
{
averageMap() : lowerCount(0), lowerSum(0), upperSum(0) {}
averageMap operator()(const averageMap& input,
const Values::value_type& current)
{
if (current.first > boundary)
{
upperSum += current.second;
}
else
{
lowerSum += current.second;
++lowerCount;
}
return *this;
}
static size_t boundary;
size_t lowerCount;
unsigned int lowerSum;
unsigned int upperSum;
};
size_t averageMap::boundary(0);
struct averageRange
{
averageRange() : count(0), sum(0) {}
averageRange operator()(const averageRange& input,
const Values::value_type& current)
{
sum += current.second;
++count;
return *this;
}
size_t count;
unsigned int sum;
};
int main()
{
Values values;
values[1] = 10;
values[3] = 28;
values[290] = 78;
values[1110] = 110;
averageMap::boundary = 100;
averageMap result = accumulate(values.begin(), values.end(),
averageMap(boundary), averageMap(boundary));
averageRange result2 = accumulate(values.lower_bound(2), values.upper_bound(300),
averageRange(), averageRange());
return 0;
};
旧版本:
这个对我有用。使用从map::upper_bound
检索的范围上accumulate
存在问题,因为许多STL操作要求最终迭代器可以从范围中的第一个到达。这里有一点小技巧-假设map
的值是>= 0。
#include <map>
#include <algorithm>
#include <numeric>
#include <vector>
using namespace std;
typedef map<unsigned int, unsigned int> Values;
int main()
{
Values values;
values[1] = 10;
values[3] = 28;
values[290] = 78;
values[1110] = 110;
size_t boundary(100);
Values::iterator iter = values.upper_bound(boundary);
vector<int> lowerRange(values.size(), -1);
transform(values.begin(), iter, lowerRange.begin(),
[](std::pair<unsigned int, unsigned int> p)
-> int { return p.second; });
vector<int>::iterator invalid(find(lowerRange.begin(),
lowerRange.end(), -1));
size_t lowerCount(distance(lowerRange.begin(), invalid));
lowerRange.resize(lowerCount);
vector<int> upperRange(values.size() - lowerCount);
transform(iter, values.end(), upperRange.begin(),
[](std::pair<unsigned int, unsigned int> p)
-> int { return p.second; });
size_t lowerAverage = accumulate(lowerRange.begin(),
lowerRange.end(), 0) / lowerRange.size();
size_t upperAverage = accumulate(upperRange.begin(),
upperRange.end(), 0) / upperRange.size();
return 0;
};