当前位置:  开发笔记 > 编程语言 > 正文

stl :: multimap - 如何获取数据组?

如何解决《stl::multimap-如何获取数据组?》经验,为你挑选了3个好方法。

Multimap实际上具有按键排序的数据组.我想要一种方法,通过该方法我可以访问这些单独的组并获取它们的聚合值.例如,在std::multimap< string, int >I商店中

{"Group1", 1}, 
{"Group1", 2}, 
{"Group1", 3}, 

{"Group2", 10}, 
{"Group2", 11}, 
{"Group2", 12}

存储了这些值之后,我应该能够迭代这个多图并获得每个"组"的聚合值.问题是STL中没有定义任何以这种方式访问​​MultiMaps的函数.我可以使用lower_bound,upper_bound手动迭代多图并总计组的内容,但我希望有更好的方法在STL中定义?任何人都可以提出一个解决方案,如何在上面的例子中获取组的聚合值.



1> Greg Rogers..:
pair range = my_multimap.equal_range("Group1");
int total = accumulate(range.first, range.second, 0);

是一种方式.

编辑:

如果你不知道你正在寻找的小组,并且只是通过每个小组,那么获得下一组的范围可以这样做:

template 
struct Less : public std::binary_function
{
    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());


是的,这似乎是一个错误.`adjacent_find`需要一个"相等"的谓词.另外,我确信有'std :: equal_to `准备使用.

2> 小智..:
// samekey.cpp -- Process groups with identical keys in a multimap

#include 
#include 
#include 
using namespace std;

typedef multimap 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 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



3> Mark Ransom..:

如果您已经知道了密钥,则可以使用它multimap::equal_range来获取组的开头和结尾的迭代器; 使用任何标准算法从范围中获得所需的结果.如果你不知道密钥,你可以begin()自己开始并迭代它们,比较密钥以找到每个新组的开始.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有