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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.72
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 00:05     сортировка в multimap #1
доброго времени суток.
собственно, вопрос такой:
есть программа использующая контейнер класса multimap. содержит пару <ключ,структура> нужно организовать в этой программе поиск по полям, записанным в структуре. есть ли возможность это организовать стандартными средствами библиотеки STL или нужно писать алгоритм для сортировки структуры?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 00:05     сортировка в multimap
Посмотрите здесь:

C++ STL multimap.
неверное выполнение multimap C++
multimap: Сортировка значений в пределах одного ключа C++
C++ multimap
Multimap зацикливается C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
13.10.2011, 04:00     сортировка в multimap #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;
}
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 12:08  [ТС]     сортировка в multimap #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 минут
на мой взгляд он ничего не записывает в вектор, но как это решить - хз.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.10.2011, 12:14     сортировка в multimap #4
Цитата Сообщение от Mut Посмотреть сообщение
на мой взгляд он ничего не записывает в вектор, но как это решить - хз.
Ну да, у тебя пустой вектор (vector<aNote> v. Решение - записать в него данные.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
13.10.2011, 12:28     сортировка в multimap #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);
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 12:47  [ТС]     сортировка в multimap #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

 Комментарий модератора 
Прикрепляйте картинки к сообщениям.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
13.10.2011, 13:09     сортировка в multimap #7
Цитата Сообщение от Mut Посмотреть сообщение
есть программа использующая контейнер класса multimap. содержит пару <ключ,структура> нужно организовать в этой программе поиск по полям, записанным в структуре. есть ли возможность это организовать стандартными средствами библиотеки STL или нужно писать алгоритм для сортировки структуры?
Есть. Алгоритм find_if.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
13.10.2011, 13:22     сортировка в multimap #8
Найти можно, сортировать нет.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
13.10.2011, 14:37     сортировка в multimap #9
Цитата Сообщение от Mut Посмотреть сообщение
код добавил, но сортировка не происходит
по полю name как раз таки происходит
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
13.10.2011, 14:38     сортировка в multimap #10
Цитата Сообщение от Mut Посмотреть сообщение
код добавил, но сортировка не происходит
На скриншоте две струтуры отсортированные, как я понимаю, по полю name.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
13.10.2011, 15:06     сортировка в multimap #11
Можно же параметром шаблона для multimap передать функтор, который будет автоматически сортировать элементы в нужном порядке. Или я чего то не понял?
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 15:12  [ТС]     сортировка в multimap #12
Цитата Сообщение от rangerx Посмотреть сообщение
На скриншоте две струтуры отсортированные, как я понимаю, по полю name.
точно! спасибо. не досмотрел. все работает

Добавлено через 59 секунд
Цитата Сообщение от Kastaneda Посмотреть сообщение
Можно же параметром шаблона для multimap передать функтор, который будет автоматически сортировать элементы в нужном порядке. Или я чего то не понял?
стандартного алгоритма для сортировки multimap не существует
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.10.2011, 15:12     сортировка в multimap #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;
}
Нет, как только в дело вступает итератор на неизвестны тип, сразу ошибка.
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 15:14  [ТС]     сортировка в multimap #14
Цитата Сообщение от kravam Посмотреть сообщение
Нет, как только в дело вступает итератор на неизвестны тип, сразу ошибка.
тут возможно стоит подключить <vector>
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.10.2011, 15:17     сортировка в multimap #15
Ага, я пропустил. Но тем не менее, убедись как говорится сам.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
13.10.2011, 15:19     сортировка в multimap #16
Цитата Сообщение от Mut Посмотреть сообщение
стандартного алгоритма для сортировки multimap не существует
Да я не об этом, при создании множества можно же назначить функцию, которая будет вызываться каждый раз при добавлении нового элемента. Таким образом множество будет сортироваться само собой.
http://cplusplus.com/reference/stl/multimap/multimap/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 15:21     сортировка в multimap
Еще ссылки по теме:

C++ multimap::emplace()
Помещение данных в multimap C++
Multimap. Ошибка operator+ not implemented in type multimap C++

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

Или воспользуйтесь поиском по форуму:
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
13.10.2011, 15:21  [ТС]     сортировка в multimap #17
как я писал выше, все нужно делать при помощи STL. сортировку тоже. да и проблема уже разрешилась
Yandex
Объявления
13.10.2011, 15:21     сортировка в multimap
Ответ Создать тему
Опции темы

Текущее время: 17:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru