Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > STL: Map


Автор: Gaz 1.6.2002, 11:33
Насколько я знаю, в Map сортировка происходит по ключу. А я хотел бы чтоб сортировка была по значению ключа. Мне нужно подсчитать количество вхождения каждого слов в файле. Что можете посоветовать?

Автор: Gaz 2.6.2002, 08:47
Крутые программеры!!! неужели это сложный вопрос?

Автор: Sceptik 30.8.2006, 11:37
Используй функторы.

Автор: MAKCim 30.8.2006, 13:16
Код

class cmp
{
private:
    typedef std::pair<int,double> pair_type;
public:
    bool operator(const pair_type& obj_a, const pair_type& obj_b)
    {
        double d_a=obj_a.second(), d_b=obj_b.second;
        return d_a<d_b;
    }
};
...
map<int, double> map_;
...
std::sort(map_.begin(),map_.end(),cmp());

Автор: _hunter 30.8.2006, 13:32
что-то я сомневаюсь что по прошествию ЧЕТЫРЕХ ЛЕТ данный вопрос остался актуальным...

Автор: Romikgy 30.8.2006, 13:44
Цитата(_hunter @  30.8.2006,  12:32 Найти цитируемый пост)
что-то я сомневаюсь что по прошествию ЧЕТЫРЕХ ЛЕТ данный вопрос остался актуальным..

полный ГЫ  smile 

Автор: threef 30.8.2006, 14:24
Попробуй так:
Код

    char buf[256];
    FILE* f;
    map<string,int> dictionare;
    char seps[]=" .,/\"\'~!@#$%^&*()-+=|:;\t\n\r\\{}[]<>";
    char *word;
    f=fopen("source1.cpp","r");
    if(!f)
    {
        cout<<"not opened\n";
        return;
    }

    while(fgets(buf,256,f))
    {   
        word=strtok(buf,seps);
        while(word)
        {
          //cout<<word<<'\t';
          dictionare[word]++;
          word=strtok(NULL,seps);
        }
        //cout<<'\n';
    }
    fclose(f);
    multimap <int,string> mirror;
    typedef pair <int,string> pis;
    for ( map<string,int>::iterator i = dictionare.begin( );
                                                i != dictionare.end( ); i++ )
    {
        cout <<i->first<< " " << i -> second<<'\t';
        mirror.insert(pis(i->second,i->first));
    }
    cout<<"\n\n!!!!!!!!!!!!and mirror now\n\n";
    for ( multimap<int,string>::iterator i = mirror.begin( ); i != mirror.end( ); i++ )
    {
        cout <<i->first<< " " << i -> second<<'\t';
    }



А вообще-то нужно переопределить операции сравнения по ключу, см.MSDN2003

Автор: _hunter 30.8.2006, 15:29
еще один некрофил...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)