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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.72
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
#1

сортировка в multimap - C++

13.10.2011, 00:05. Просмотров 3919. Ответов 16
Метки нет (Все метки)

доброго времени суток.
собственно, вопрос такой:
есть программа использующая контейнер класса multimap. содержит пару <ключ,структура> нужно организовать в этой программе поиск по полям, записанным в структуре. есть ли возможность это организовать стандартными средствами библиотеки STL или нужно писать алгоритм для сортировки структуры?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 00:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос сортировка в multimap (C++):

Multimap. Ошибка operator+ not implemented in type multimap - C++
Я начинающий в си, есть задача подсчета частоты встречаемости символов, делал через ассоциативный массив map&lt;char, int&gt;, программа...

multimap: Сортировка значений в пределах одного ключа - C++
Добрый день. Каким образом можно отсортировать значения в пределах одного ключа в multimap? Без костылей.

multimap - C++
Я что-то не понимаю в чем проблема! #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;map&gt; using namespace std; int main() ...

Ошибка с multimap - C++
Здравствуйте, помогите пожалуйста разобраться есть multimap переменная T_rules, в которой лежат T_rule_head, T_state_name ...

STL multimap. - C++
#include &quot;stdafx.h&quot; #include &lt;map&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include &quot;conio.h&quot; #include &lt;iostream&gt; using...

multimap::emplace() - C++
При компиляции этого кода: #include &lt;iostream&gt; #include &lt;map&gt; using namespace std; int main () { multimap&lt;char,int&gt;...

16
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
13.10.2011, 04:00 #2
Цитата Сообщение от Mut Посмотреть сообщение
есть ли возможность это организовать стандартными средствами библиотеки STL
Нет, multimap и так содержит в себе функционал сортировки по ключам при вставке нового элемента.
Цитата Сообщение от Mut Посмотреть сообщение
или нужно писать алгоритм для сортировки структуры?
Вот посмотри код ниже прикрутил сортировку для структуры выбрал поле с числовым значением.
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
#include <iostream>
#include <map>
using namespace std;
 
struct hero {
   char name[16];
   int  age; // сортировка будет производиться по этому полю
   hero(void) {}
   hero(char* name, int age) {
      strcpy(this->name, name);
      this->age = age;
   }
   bool operator < (hero obj) const {
      return (this->age < obj.age);
   }
   bool operator > (hero obj) const {
      return (this->age > obj.age);
   }
};
 
 
// ключ константный пришлось применить грубую силу
template<typename KEY, typename TYPE>
void  sort_multimap(multimap<KEY, TYPE>* mmap) {
   multimap<KEY, TYPE>::iterator first = mmap->begin(), last = mmap->end();
   multimap<KEY, TYPE>::iterator a, b;
   TYPE tdata;
   KEY  tkey;
prev:
   b = first;
   for(a = b++; b != last; *a++, *b++) {
       if(a->second > b->second) {
             tkey = (KEY) a->first; 
             tdata = a->second;
             a->second = b->second;
             b->second = tdata;
            *(KEY*)&a->first = b->first;
            *(KEY*)&b->first = tkey;
             goto prev;
        }
    }
}
 
int  main(void) {
   multimap<char, hero> m;
 
   m.insert(make_pair('B', hero("Bob",  30)));
   m.insert(make_pair('S', hero("Stas", 20)));
   m.insert(make_pair('A', hero("Alex", 25)));
   m.insert(make_pair('K', hero("Katy", 19)));
   m.insert(make_pair('A', hero("Angel",29)));
 
   // вывод до сортировки
   for(multimap<char, hero>::const_iterator q = m.begin(); q != m.end(); *q++) 
       cout << q->first << '\t' << q->second.name << "\t\t" << q->second.age << endl;
   
   // пузырковый вариант сортировки
   sort_multimap(&m);
 
   cout.put('\n');
   // результат сортировки
   for(multimap<char, hero>::const_iterator i = m.begin(); i != m.end(); *i++) 
       cout << i->first << '\t' << i->second.name << "\t\t" << i->second.age << endl;
 
   m.clear();
   cin.get();
   return 0;
}
0
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 12:08  [ТС] #3
т.к. тема работа со стандартной библиотекой stl, То нужно делать преобразование multimap -> vector, сортировать вектор и выводить
структура
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct aNote
{   public:
    string name;
    string sname;
    int date;
    int tnumb;
    aNote(string n,string sn,int d, int tn);
    void read_note();
    static bool PrintSorted(const aNote& n1, const aNote& n2)
    {
        return n1.name < n2.name;
    }
класс с методами
C++
1
2
3
4
5
6
7
8
9
10
11
class my_note
{   public:
    typedef bool SortPredicate(const aNote&, const aNote&);
    void AddNote(const aNote& ob);
    void ViewNotes(const aNote& ob);
    void SearchNote(const aNote& ob);
    void DeleteNote(const aNote& ob);
    void PrintSorted(SortPredicate p);
    multimap<string,aNote> note;
    multimap<string,aNote>::iterator cur;
 };
реализация метода сортировки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void my_note::PrintSorted(SortPredicate p)
    {
        /*vector<aNote> vect(note.size());
        cur=note.begin();
        for (int i=0;cur!=note.end();++cur,i++)
        {
            vect[i] = *cur;
        }*/
        vector<aNote> v;
        sort(v.begin(),v.end(),p);
        vector<aNote>::iterator _cur=v.begin();
        for(_cur;_cur!=v.end();++_cur)
        {
            cout<<_cur->name<<" "<<_cur->sname<<endl;
        }
    }
и вызов метода сортировки
C++
1
choise.PrintSorted(aNote::PrintSorted);
собственно на этапе компиляции ошибок нет, но ничего на экран не выводится.

Добавлено через 14 минут
на мой взгляд он ничего не записывает в вектор, но как это решить - хз.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.10.2011, 12:14 #4
Цитата Сообщение от Mut Посмотреть сообщение
на мой взгляд он ничего не записывает в вектор, но как это решить - хз.
Ну да, у тебя пустой вектор (vector<aNote> v. Решение - записать в него данные.
1
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
13.10.2011, 12:28 #5
Цитата Сообщение от Mut Посмотреть сообщение
C++
1
2
3
4
5
6
/*vector<aNote> vect(note.size());
cur=note.begin();
for (int i=0;cur!=note.end();++cur,i++)
{
    vect[i] = *cur;
}*/
C++
1
2
3
4
5
vector<aNote> vect;
vect.reserve(note.size());
cur = note.begin();
for(size_t i = 0; cur != note.end(); ++cur, ++i) 
    vect.push_back(cur->second);
0
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 12:47  [ТС] #6
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void my_note::PrintSorted(SortPredicate p)
    {
        vector<aNote> v;
        for (cur=note.begin();cur!=note.end();++cur)
        {
            v.push_back((*cur).second);
        }
        sort(v.begin(),v.end(),p);
        vector<aNote>::iterator _cur=v.begin();
        for(_cur;_cur!=v.end();++_cur)
        {
            cout<<"[Фамилия]: "<<_cur->sname<<"\n[Имя]: "<<_cur->name<<"\n[Дата рождения]: "<<_cur->date<<"\n[Номер телефона]: "<<_cur->tnumb<<endl;
            cout<<endl;
        }
    }
код добавил, но сортировка не происходит
сортировка в multimap

 Комментарий модератора 
Прикрепляйте картинки к сообщениям.
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.10.2011, 13:09 #7
Цитата Сообщение от Mut Посмотреть сообщение
есть программа использующая контейнер класса multimap. содержит пару <ключ,структура> нужно организовать в этой программе поиск по полям, записанным в структуре. есть ли возможность это организовать стандартными средствами библиотеки STL или нужно писать алгоритм для сортировки структуры?
Есть. Алгоритм find_if.
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
13.10.2011, 13:22 #8
Найти можно, сортировать нет.
0
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
13.10.2011, 14:37 #9
Цитата Сообщение от Mut Посмотреть сообщение
код добавил, но сортировка не происходит
по полю name как раз таки происходит
1
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
13.10.2011, 14:38 #10
Цитата Сообщение от Mut Посмотреть сообщение
код добавил, но сортировка не происходит
На скриншоте две струтуры отсортированные, как я понимаю, по полю name.
1
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
13.10.2011, 15:06 #11
Можно же параметром шаблона для multimap передать функтор, который будет автоматически сортировать элементы в нужном порядке. Или я чего то не понял?
0
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 15:12  [ТС] #12
Цитата Сообщение от rangerx Посмотреть сообщение
На скриншоте две струтуры отсортированные, как я понимаю, по полю name.
точно! спасибо. не досмотрел. все работает

Добавлено через 59 секунд
Цитата Сообщение от Kastaneda Посмотреть сообщение
Можно же параметром шаблона для multimap передать функтор, который будет автоматически сортировать элементы в нужном порядке. Или я чего то не понял?
стандартного алгоритма для сортировки multimap не существует
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
13.10.2011, 15:12 #13
xAtom, тут что-то не то.
Вот твой код, я его донельзя упростил, он не компилится
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <map>
#include <string.h>
using namespace std;
 
template<typename KEY, typename TYPE>
void  sort_multimap (multimap<KEY, TYPE>* mmap) {
 multimap<KEY, TYPE>::iterator first;
}
 
int  main(void) {
 return 0;
}
Всё дело в sort_multimap, а ведь эта функция даже невызывается, просто голое определение. И то верно, эта тема натыкает нас на ответ:
http://www.cyberforum.ru/cpp-beginne...ead312411.html

А вот арифметика итераторов
http://www.cplusplus.com/reference/stl/multimap/begin/

На всякий случай ещё упростил код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <map>
#include <string.h>
using namespace std;
 
template<typename KEY_>
void  sort_multimap () {
 vector<KEY_> vec;
 //vector<KEY_>::iterator it;
}
 
 
int  main(void) {
 return 0;
}
Нет, как только в дело вступает итератор на неизвестны тип, сразу ошибка.
0
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 15:14  [ТС] #14
Цитата Сообщение от kravam Посмотреть сообщение
Нет, как только в дело вступает итератор на неизвестны тип, сразу ошибка.
тут возможно стоит подключить <vector>
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
13.10.2011, 15:17 #15
Ага, я пропустил. Но тем не менее, убедись как говорится сам.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 15:17
Привет! Вот еще темы с ответами:

Multimap зацикливается - C++
Всем добрый вечер, Помогите, пожалуйста разобраться с зацикленным &quot;Not found&quot;. Поиск по названию блюда происходит нормально, а вот...

неверное выполнение multimap - C++
В задачу программы входит заполнения контейнера multimap и вывод содержимого построчно(все на стандартных потоках). Програмка работает но...

Работа с контейнером multimap - C++
Помогите пожалуйста. Вот вся задача: Определить класс autoOwnerDirectory (каталог автовладельцев), хранящий информацию об автовладельцах...

Помещение данных в multimap - C++
добрый день, можете подсказать как можно сделать, те данные что я помещаю в моем коде в map, поместить в multimap вот код ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
13.10.2011, 15:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru