题
基于本质上具有群体的数据的关键。我希望有一个方法,通过这种方法我可以访问这些个别群体,并得到它们的总体价值。例如,在一个 std::multimap< string, int >
我的商店
{"Group1", 1},
{"Group1", 2},
{"Group1", 3},
{"Group2", 10},
{"Group2", 11},
{"Group2", 12}
具有储存这些价值观,我应该可以迭代基于这并获得总值的每一个"团体"。问题是没有任何功能的定义限于访问在图在这样一种方式。我可以用 lower_bound
, upper_bound
手动迭代基于和总组的内容,但我希望有可能是更好的方法已经规定在STL?任何人都可以提出一个解决方案如何,我可以得到总价值为小组在上面的例子。
解决方案
pair<Iter, Iter> range = my_multimap.equal_range("Group1");
int total = accumulate(range.first, range.second, 0);
是的一种方式。
编辑:
如果你不知道你正在寻找的,都是要通过每个集团,得到下一个小组的范围内可以做像这样:
template <typename Pair>
struct Less : public std::binary_function<Pair, Pair, bool>
{
bool operator()(const Pair &x, const Pair &y) const
{
return x.first < y.first;
}
};
Iter first = mmap.begin();
Iter last = adjacent_find(first, mmap.end(), Less<MultimapType::value_type>());
其他提示
// samekey.cpp -- Process groups with identical keys in a multimap
#include <iostream>
#include <string>
#include <map>
using namespace std;
typedef multimap<string, int> StringToIntMap;
typedef StringToIntMap::iterator mapIter;
int main ()
{
StringToIntMap mymap;
mymap.insert(make_pair("Group2", 11));
mymap.insert(make_pair("Group1", 3));
mymap.insert(make_pair("Group2", 10));
mymap.insert(make_pair("Group1", 1));
mymap.insert(make_pair("Group2", 12));
mymap.insert(make_pair("Group1", 2));
cout << "mymap contains:" << endl;
mapIter m_it, s_it;
for (m_it = mymap.begin(); m_it != mymap.end(); m_it = s_it)
{
string theKey = (*m_it).first;
cout << endl;
cout << " key = '" << theKey << "'" << endl;
pair<mapIter, mapIter> keyRange = mymap.equal_range(theKey);
// Iterate over all map elements with key == theKey
for (s_it = keyRange.first; s_it != keyRange.second; ++s_it)
{
cout << " value = " << (*s_it).second << endl;
}
}
return 0;
} // end main
// end samekey.cpp
如果你已经知道的钥匙,你可以使用 multimap::equal_range
得到的迭代的开始和结束的集团;使用任何标准算法,以获得所需结果的范围。如果你不知道的钥匙,你可以开始 begin()
和迭代他们自己的、比较键要找到开始的每一个新的小组。
你可以使用一个备用的容器,可以包含总额的每一个组。要做到这一点你可能会这样做:
template <class KeyType, class ValueType>
struct group_add {
typedef map<KeyType, ValueType> map_type;
map_type & aggregates;
explicit group_add(map_type & aggregates_)
: aggregates(aggregates_) { };
void operator() (map_type::value_type const & element) {
aggregates[element.first] += element.second;
};
};
template <class KeyType, class ValueType>
group_add<KeyType, ValueType>
make_group_adder(map<KeyType, ValueType> & map_) {
return group_add<KeyType, ValueType>(map_);
};
// ...
multimap<string, int> members;
// populate members
map<string, int> group_aggregates;
for_each(members.begin(), members.end(),
make_group_adder(group_aggregates));
// group_aggregates now has the sums per group
当然,如果你有氧的(C++0x)这可能是简单的:
multimap<string, int> members;
map<string, int> group_aggregates;
for_each(members.begin(), members.end(),
[&group_aggregates](multimap<string, int>::value_type const & element) {
group_aggregates[element.first] += element.second;
}
);
equal_range
语法:
#include <map>
pair<iterator, iterator> equal_range( const key_type& key );
功能 equal_range()
返回两个迭代人的第一个元素包含有关键,另一个要点只是最后的元素,其中包含的关键。
不是一个基于答案,但是你可以做的事情如下如果你选择这样做。
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <boost/assign/list_of.hpp>
#include <boost/foreach.hpp>
using namespace std;
using namespace boost;
using namespace boost::assign;
int main() {
typedef map<string, vector<int> > collection;
collection m;
m["Group 1"] = list_of(1)(2)(3);
m["Group 2"] = list_of(10)(11)(12);
collection::iterator g2 = m.find("Group 2");
if (g2 != m.end()) {
BOOST_FOREACH(int& i, g2->second) {
cout << i << "\n";
}
}
}
不隶属于 StackOverflow