Multimap实际上具有按键排序的数据组.我想要一种方法,通过该方法我可以访问这些单独的组并获取它们的聚合值.例如,在std::multimap< string, int >I商店中
{"Group1", 1},
{"Group1", 2},
{"Group1", 3},
{"Group2", 10},
{"Group2", 11},
{"Group2", 12}
Run Code Online (Sandbox Code Playgroud)
存储了这些值之后,我应该能够迭代这个多图并获得每个"组"的聚合值.问题是STL中没有定义任何以这种方式访问MultiMaps的函数.我可以使用lower_bound,upper_bound手动迭代多图并总计组的内容,但我希望有更好的方法在STL中定义?任何人都可以提出一个解决方案,如何在上面的例子中获取组的聚合值.
Gre*_*ers 40
pair<Iter, Iter> range = my_multimap.equal_range("Group1");
int total = accumulate(range.first, range.second, 0);
Run Code Online (Sandbox Code Playgroud)
是一种方式.
编辑:
如果你不知道你正在寻找的小组,并且只是通过每个小组,那么获得下一组的范围可以这样做:
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>());
Run Code Online (Sandbox Code Playgroud)
小智 20
// 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
Run Code Online (Sandbox Code Playgroud)
Mar*_*som 11
如果您已经知道了密钥,则可以使用它multimap::equal_range来获取组的开头和结尾的迭代器; 使用任何标准算法从范围中获得所需的结果.如果你不知道密钥,你可以begin()自己开始并迭代它们,比较密钥以找到每个新组的开始.