Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175

Сортировка вектора объектов по 3 параметрам

23.11.2020, 05:20. Показов 4102. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть объект книга
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Book {
private:
    string data; //name of the book
    vector<string> authors;
    int v;
    int d, m, y;
    int pages;
    string plot;
    int id ;
public:
    Book(string data, vector<string> authors, int v, int d, int m, int y, int pages, string plot, int id);
    string GetData();
    string GetAuthor(int i);
    int GetDay();
    int GetMonth();
    int GetYear();
    int GetPages();
    string GetPlot();
    int GetVectorSize();
    /*std::vector<T> GetVectorF() { return v; };*/
    int GetId();
    bool way;
};
и есть их вектор. Как его отсортировать по дате выхода книг. Тоесть сначало по году, потом по месяцу и дню. Знаю, что в sort есть 3 параметр, но не знаю как им пользоваться. Буду благодарен если напишите реализации и поеснение к ней
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2020, 05:20
Ответы с готовыми решениями:

Сортировка объектов вектора
class Words { public: int number; // Номер в словаре для быстрого поиска string word; // Само слово vector...

Сортировка вектора объектов по полю
Всем доброго времени суток. Знаю, что вопрос часто задаваемый, но я не нашел для себя ответа. В голове смешалось все. Лямбды, ф-ии...

Std::sort сортировка вектора объектов
Добрый день. Пытаюсь выполнить сортировку вектора объектов с помощью функции сравнения #include &quot;stdafx.h&quot; #include...

16
10 / 7 / 3
Регистрация: 18.11.2020
Сообщений: 26
23.11.2020, 16:14
я еще новичок, но примерно так
пишем функцию компаратор пары под классом, как нам надо, например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
bool comparator(Book& book1, Book& book2)
{
    if (book1.GetYear() == book2.GetYear())
    {
        if (book1.GetMonth() == book2.GetMonth())
            return book1.GetDay() < book2.GetDay();
        else
            return book1.GetMonth() < book2.GetMonth();
    }
    else
        return book1.GetYear() < book2.GetYear();
}
и вставляем в сорт так:
C++
1
std::sort(arr.begin(), arr.end(), comparator);
Добавлено через 1 час 27 минут
Кстати, вспомнилось, что можно и без компараторов, перегрузив оператор сравнения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Book {
    int d, m, y;
//....остальной код
public:
//....остальной код
    friend bool operator<(Book& book1, Book& book2);
};
 
bool operator<(Book& book1, Book& book2)
{
    if (book1.y == book2.y)
    {
        if (book1.m == book2.m)
            return book1.d < book2.d;
 
        return book1.m < book2.m;
    }
 
    return book1.y < book2.y;
}
сортировка без компаратора
C++
1
std::sort(arr.begin(), arr.end());
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
24.11.2020, 01:48  [ТС]
С перегрузкой не знаком. Попробывал как вы и выдает такие ошибки
error C2804: бинарный "operator <" имеет слишком много параметров
error C2333: HeroFunctions<T,U>::operator <: ошибка в объявлении функции; пропуск основного текста функции
error C2333: HeroFunctions<std::string,Hero>::operato r <: ошибка в объявлении функции; пропуск основного текста функции
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
bool operator<(Book* book1, Book* book2)
    {
        if (book1->GetYear() == book2->GetYear())
        {
            if (book1->GetMonth() == book2->GetMonth())
                return book1->GetDay() < book2->GetDay();
 
            return book1->GetMonth() < book2->GetMonth();
        }
        return book1->GetYear() < book2->GetYear();
    }
    /*! Add a character.*/
    void AddHero(Node<Book>* r) {
        int a;
        vector<Book*> books;
        vector<string> names;
        int n; string s, data;
        multimap<int, Node<Book>*> role;
        cout << "Enter character name" << endl;
        getline(cin, data);
        cout << "Enter the number of his aliases / names" << endl;
        cin >> n;
        cout << "Fill them in " << endl;
        cin.ignore(1, '\n');
        for (int i = 0; i < n; i++) {
            getline(cin, s);
            names.push_back(s);
        }
        cout << "Enter the number of books in which it appears" << endl;
        cin >> n;
        cout << "Fill the book and its role in it " << endl;
        for (int i = 0; i < n; i++) {
            cout << "Choose book ID" << endl;
            bf.PrintInOrder(r);
            cin >> a;
            Node<Book>* ptr = bf.FindId(a, r);
            cout << "What is his role (1-main, 2-minor, 3-episodic)" << endl;
            cin >> a;
            cin.ignore(1, '\n');
            role.insert(pair<int, Node<Book>*>(a, ptr));
            books.push_back(ptr->data);
        }
        sort(books.begin(), books.end());
        Hero* h = new Hero(data, n, names, role, id, books );
        id++;
        bst.AddLeaf(h, bst.GetRoot());
    }
Добавлено через 3 минуты
shizanuki aya, попробывал первый вариант и он выает такие ошибки
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3

Добавлено через 51 секунду
shizanuki aya, https://github.com/LavrovSergey/test вот тут весь проект. Думаю если запустите сразу поймете, где ошибки
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
24.11.2020, 01:54
БесподобeH, вы покажите как используете:
C++
1
#include <algorithm>
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
24.11.2020, 02:24  [ТС]
Jason, в плане как использую?

Добавлено через 44 секунды
Jason, ну я подключил это

Добавлено через 1 минуту
В векторе books у меня указатели на книги

Добавлено через 3 минуты
sort у меня подсвечивается(как и весь код в visual studio) только если убрать из скобок comparator, а если сделать как в примере выше, то sort становится просто белым

Добавлено через 21 минуту
Jason, https://github.com/LavrovSergey/test просто запустите, увидьте, где проблема и скажите как исправить
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
24.11.2020, 02:43
БесподобeH, сейчас посмотреть не могу, не за компьютером.
Вот написал пример, по другому не знаю как объяснить:
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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
struct str
{
    int x;
    
    str(int a)
    {
        x = a;
    }
};
 
bool comp(str *a, str *b)
{
    if (a->x < b->x)
        return true;
    else
        return false;
}
 
int main()
{
    vector<str *> a;
    a.push_back(new str(2));
    a.push_back(new str(1));
    a.push_back(new str(3));
    sort(a.begin(), a.end(), comp);
 
    for (int i = 0; i < 3; i++)
        cout << a[i]->x << " ";
    
    cout << endl << endl;
        
    str* s[3];
    s[0] = new str(0);
    s[1] = new str(2);
    s[2] = new str(1);
    sort(s, s + 3, comp);
    for (int i = 0; i < 3; i++)
        cout << s[i]->x << " ";
}
Добавлено через 49 секунд
Для вектора и массива указателей на структуры.

Добавлено через 5 минут
попробывал первый вариант и он выает такие ошибки
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
Просто, еще и не понятно где находится ваш компаратор...

И как вы его передаёте.
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
24.11.2020, 02:44  [ТС]
Jason, сделал по вашему примеру. Вот ошибки
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
24.11.2020, 03:27
Посмотрел код на git, используете ссылки в компараторе, какие ссылки? Если вектор/массив указателей...

Добавлено через 2 минуты
Исправили:
C++
1
2
3
4
5
6
7
   bool comparator( Book* a,  Book* b) {
        if (a->GetYear() < b->GetYear()) return true;
        if (a->GetYear() > b->GetYear()) return false;
        if (a->GetMonth() < b->GetMonth()) return true;
        if (a->GetMonth() > b->GetMonth()) return false;
        return a->GetDay() < b->GetDay();
    }
Добавлено через 5 минут
Получилось?
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
24.11.2020, 03:34  [ТС]
Нет. Как мне указали на другом форму. Оно не хочет работать из=за того что в векторе указатели. Надо их разименовать и все заработает, но как это правильно сделать я не знаю

Добавлено через 14 секунд
Jason, Нет. Как мне указали на другом форму. Оно не хочет работать из=за того что в векторе указатели. Надо их разименовать и все заработает, но как это правильно сделать я не знаю
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
24.11.2020, 03:58
Зачем новая тема? Я вам привёл простой пример, с указателями на структуры, там все работает.

Добавлено через 47 секунд
C++
1
bool comparator( Book* a,  Book* b)
Вот, исправляли же...

Добавлено через 1 минуту
У вас какие-то указатели особенные?
0
-1 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 175
24.11.2020, 04:06  [ТС]
Jason, не работает с указателями пишет это
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
24.11.2020, 04:50
Все работает:
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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
class Book
{
  public:
    string data;
    vector<string> authors;
    int v;
    int d, m, y;
    int pages;
    string plot;
    int id;
public:
    Book(int a, int b, int c) {
        d = a;
        m = b;
        y = c;
    }
};
 
bool comparator(Book *a, Book *b)
{
    if (a->y < b->y) return true;
    if (a->y > b->y) return false;
    if (a->m < b->m) return true;
    if (a->m > b->m) return false;
    return a->d < b->d;
}
 
int main()
{
    vector<Book*> books;
    books.push_back(new Book(1, 2, 3));
    books.push_back(new Book(2, 4, 3));
    books.push_back(new Book(3, 2, 3));
    sort(books.begin(), books.end(), comparator);
    cout << books[2]->d;
}
Добавлено через 6 минут
Это точно из-за сортировки?
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член.
Если сортировку убрать скомпилировать получится?

Добавлено через 23 минуты
Так попробуй:
C++
1
2
3
static bool comparator( Book* a,  Book* b) {
    ...
}
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
24.11.2020, 07:51
Цитата Сообщение от БесподобeH Посмотреть сообщение
Jason, не работает с указателями пишет это
легко сказать не работает, а показать?
смотрели здесь?
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,003
24.11.2020, 09:01
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>
 
class Book
{
  public:
    int d{}, m{}, y{};
    int v{};
    int pages{};
    int id{};
    std::string plot;
    std::string data;
    std::vector<std::string> authors;
public:
    Book(int d, int m, int y):d(d),m(m),y(y)
    {
    }
 
    bool operator<(const Book& r)const
    {
        return  std::tie(  y,   m,   d)<
                std::tie(r.y, r.m, r.d);
    }
 
    struct comparator
    {
        bool operator()(const Book& a,const Book& b)const{return a < b;}
        bool operator()(const Book* a,const Book* b)const{return *a < *b;}
    };
};
 
int main()
{
    std::vector<Book*> books
    {
        new Book(1, 2, 3),
        new Book(2, 4, 3),
        new Book(3, 2, 3),
    };
 
    std::sort(books.begin(), books.end(), Book::comparator{});
    
    std::cout << books[2]->d;
    
    for(auto* b:books)delete b;
    books.clear();
}
1
10 / 7 / 3
Регистрация: 18.11.2020
Сообщений: 26
24.11.2020, 09:02
БесподобeH, к сожалению, сейчас нет времени разбираться, просто вспомнилось еще, что компаратор можно сделать дружественным(если вы с этим знакомы), так код будет чище.

Просто на заметку.
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,003
24.11.2020, 09:05
shizanuki aya, дружественная функция - она глобальная. То есть, торчит в глобальный неймспейс. Это к вопросу о "чище"
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
24.11.2020, 09:10
Static должно работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2020, 09:10
Помогаю со студенческими работами здесь

Сортировка массива объектов по заданным параметрам
Здравствуйте! Нужна помощь с интерфейсом IComparer! Суть такова - имеется массив объектов (животные с параметрами - название, вес,...

Выбор конкретных объектов по параметрам
Здравствуйте, уважаемые форумчане. По учебе делаю проект небольшого сайта на Python - Django. Есть у меня классы Motherboard,...

Выделение столбцов из матрицы, сортировка полученного вектора, перестановка элементов вектора
Здравствуйте!Нужна помощь в пояснении. Дано задание в файле.По раздельности я примерно понимаю как это сделать,но я так понимаю это все...

Как правильно сделать сравнение двух объектов по нескольким параметрам?
Доброго времени суток. Столкнулся тут с проблемкой - ничего не могу :( Сравниваю два объекта по его свойствам. Написал вот такой кодик ...

Сортировка по 2-ум параметрам
Всем привет. В общем столкнулся с некой проблемой, может кто-то поможет? И так имеется массив $search_data7; В нем есть поля $row -...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru