首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++地图容器的排序

2012-10-10 
C++map容器的排序大家好,我定义了一个mapstring, int 容器,用来记录文章中每个单词出现的个数,现在想按

C++map容器的排序
大家好,我定义了一个map<string, int> 容器,用来记录文章中每个单词出现的个数,现在想按单词个数从大到小输出,请问如何对map容器进行排序呢?下面是我的程序,大家看看有啥问题,如果还有其他方法的话额外加分
[code=C/C++][/code]
#include <map>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;
typedef map<string,int>::value_type type;
bool comp(map<string,int>::value_type s1,map<string,int>::value_type s2)
{
return s1.second > s2.second;
}
int main()
{
map<string,int> m;
m.insert(type("zhang",2));
m.insert(type("aa",5));
m.insert(type("bb",4));
m.insert(type("cc",3));
//sort(m.begin(),m.end(),comp);
map<string,int>::iterator index;
for(index = m.begin(); index != m.end(); ++index){
cout << index->first << " " << index->second << endl;
}
return 0;
}



[解决办法]
我想到一个笨方法,建立两个map,一个是map<string,int>,一个是map<int,string>
如果担心string构建的代价,可以请shared_ptr解决
map<std::shared_ptr<string>,int>, map<int, std::shared_ptr<string> >

如果是我的话

C/C++ code
#ifndef HELP_00_HPP#define HELP_00_HPP#include <algorithm>#include <functional>#include <iostream>#include <iterator>#include <string>#include <vector>#include <utility>template<typename BiFunc>class sort_pair_first{public:    typedef bool result_type;    template<typename T>    bool operator()(T const &lhs, T const &rhs) const    {      return BiFunc()(lhs.first, rhs.first);      //return lhs.first < rhs.first;    }};template<typename BiFunc>class sort_pair_second{public:    typedef bool result_type;    template<typename T>    bool operator()(T const &lhs, T const &rhs) const    {      return BiFunc()(lhs.second, rhs.second);    }};class dictionaryManager{public:    dictionaryManager() {}    void add_data(std::pair<std::string, size_t> const &data)    {        dic_array_.push_back(data);    }    void add_and_sort_by_occur_time(std::pair<std::string, size_t> const &data)    {        add_data(data);        sort_by_occur_time();    }    void add_and_sort_by_word(std::pair<std::string, size_t> const &data)    {        add_data(data);        sort_by_word();    }    void print_data()    {        std::for_each(std::begin(dic_array_), std::end(dic_array_),        [](std::pair<std::string, size_t> const &data)        {           std::cout << data.first << ", " << data.second<<std::endl;        });    }    void sort_by_occur_time()    {        std::sort(std::begin(dic_array_), std::end(dic_array_),                  sort_pair_second<std::less<size_t> >() );    }    void sort_by_word()    {        std::sort(std::begin(dic_array_), std::end(dic_array_),                 sort_pair_first<std::less<std::string> >() );    }private:    dictionaryManager(dictionaryManager const&);    dictionaryManager& operator=(dictionaryManager const&);private:    std::vector<std::pair<std::string, size_t> > dic_array_;};inline void test_dictionary(){    dictionaryManager manager;    manager.add_and_sort_by_word(std::make_pair("haha", 3) );    manager.add_and_sort_by_word(std::make_pair("aa", 3) );    manager.print_data();}#endif // HELP_00_HPP 

热点排行