Форум программистов, компьютерный форум CyberForum.ru

Отсортировать контейнер map по значению элементов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ сортировка с помошью итераторов http://www.cyberforum.ru/cpp-beginners/thread272187.html
Дана последовательность действительных чисел. Необходимо используя алгоритм сортировки вставками сформировать новую последовательность, упорядоченную: а) по возрастанию; б) по убыванию. Указания. 1. Для представления последовательности необходимо использовать библиотечный шаблон vector. 2. Для доступа к элементам последовательности необходимо использовать итераторы. 3. Ввод, вывод и...
C++ Приложения под Windows Подскажите что нужно ещё учить помимо C++, чтоб писать приложения под винд. ? Дело в том, что основы С++ я уже освоил и не знаю за что теперь браться, чтоб программировать под винд. http://www.cyberforum.ru/cpp-beginners/thread272173.html
C++ сортировка строк методом выбора
ввести с клавиатуры значения элементов символьного двумерного массива. ОТСОРТИРОВАТЬ ПО возрастанию (МЕТОДОМ ВЫБОРА) элементы тех строк, которые содержат символ "/". Добавлено через 1 минуту #include <stdio.h> #include <conio.h> #include <stdlib.h> void main() { char A;
ИНТЕРЕСНОЕ)) C++
Cантехнік Петро був найнятий, щоб прокласти трубу водопостачання між двома точками міста. Мапу міста можна представити у вигляді прямокутника розміром R × S, що складається з квадратних клітинок. У деяких клітинках трубу розміщувати не можна. Петро повинен з'єднати за допомогою труби місце, розташоване безпосередньо над верхньою лівою клітинкою, і місце, розташоване прямо під нижньою правою...
C++ Cортировка двусвязного списка http://www.cyberforum.ru/cpp-beginners/thread272167.html
Ну, в общем задание в названии. Нужно отсортировать двусвязный список, методом пузырька. Сортировку-то я эту знаю. Но вот проблема, я не могу разобраться, как в двусвязном списке перейти к следующему элементу, и как сделать указатель на текущий. Да и вообще с двусвязными как-то не ладится) struct Element { Element* Prev; Element*...
C++ Заполнить матрицы по правилу Доброго времени суток. Вот встал перед проблемой при работе с матрицей. Необходимо заполнить матрицу 5х5 следующим образом 1 1 1 1 1__или__x 1 1 1 x 0 1 1 1 0_______0 x 1 x 0 0 0 1 0 0_______0 0 x 0 0 0 1 1 1 0_______0 x 1 x 0 1 1 1 1 1_______0 0 0 0 0 Исходников не прошу, хочу просто услышать мысли по этому поводу, алгоритмы реализации, мб примеры, а то щя по книжке С учу а там... подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
 Аватар для Mr.X
3014 / 1670 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
10.04.2011, 00:50     Отсортировать контейнер map по значению элементов
Ну, если вставка критична по времени, то лучше ассоциативный контейнер использовать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <map>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                       T_str;
typedef std::map       <T_str,  size_t >  T_word_counter;
typedef std::multimap  <size_t, T_str  >  T_word_of_counter;
/////////////////////////////////////////////////////////////////////////////////////////
T_str  get_random_text()
{
    const char  SIMB_MIN     = 'a';
    const char  SIMB_MAX     = 'b';
    const int   WORD_LEN     = 3;
    const int   WORDS_TOTAL  = 10; 
 
    T_str       text;
    for(int word_ind = 0; word_ind < WORDS_TOTAL; ++word_ind)
    {
        T_str  word;
        for(int  symb_ind = 0; symb_ind < WORD_LEN; ++symb_ind)
        {
            word += rand() %  (SIMB_MAX - SIMB_MIN + 1) + SIMB_MIN;            
        }
        text += word + ' ';
    }
    return  text;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_word_counter  count_text_words(const T_str&  text)
{    
    struct  T_words_count
    {
        T_word_counter  word_counter_;
        //--------------------------------------------------------------------------------
        void  operator() (const T_str&  word)
        {
            ++word_counter_[word];
        }
        //--------------------------------------------------------------------------------
        operator  T_word_counter()
        {
            return  word_counter_;
        }
    };
 
    std::istringstream  ssin(text);
    return  std::for_each(std::istream_iterator<T_str>(ssin),
                          std::istream_iterator<T_str>(),
                          T_words_count());      
}
/////////////////////////////////////////////////////////////////////////////////////////
void  print_sorted_by_frequency_words_list(const T_word_counter  word_counter)
{    
    struct  T_get_word_of_counter
    {
        T_word_of_counter  word_of_counter_;
        //-------------------------------------------------------------------------------
        void  operator() (const T_word_counter::value_type&  word_counter_val)
        {
            word_of_counter_.insert(std::make_pair(word_counter_val.second,
                                                   word_counter_val.first));
        }
        //-------------------------------------------------------------------------------
        operator  T_word_of_counter()
        {
            return  word_of_counter_;
        }
    };
 
    T_word_of_counter  word_of_counter 
        = std::for_each(word_counter.begin(), word_counter.end(), T_get_word_of_counter());
 
    for(T_word_of_counter::const_reverse_iterator  word_of_counter_it = word_of_counter.rbegin();
        word_of_counter_it != word_of_counter.rend(); ++word_of_counter_it)
    {
        std::cout << word_of_counter_it->first
                  << '\t'
                  << word_of_counter_it->second
                  << std::endl;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));   
    srand(static_cast<unsigned>(time(0)));
 
    T_str           text          = get_random_text   ();
    T_word_counter  word_counter  = count_text_words  (text);
    print_sorted_by_frequency_words_list(word_counter);   
}
 
Текущее время: 20:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru