С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
22 / 16 / 7
Регистрация: 06.06.2020
Сообщений: 56

Класс Compare для map

06.06.2020, 19:00. Показов 1036. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня.

Существует одна проблема с классом сравнения для map. Я делаю программу для вычисления температурного поля в 3-х мерном пространстве. Необходимо чтобы в map точки сначала сортировались по x, если x равны, то по y, а если и y равны, то по z.

В качестве ключа выступает следующий класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Point_in_Space
{
protected:
    required_accuracy x;
    required_accuracy y;
    required_accuracy z;
public:
    Point_in_Space
    (
        required_accuracy x,
        required_accuracy y,
        required_accuracy z
    )
       {
            this->x = x;
            this->y = y;
            this->z = z;
       };
    friend class Compare;   
};
Сам класс сравнения в следующем виде хорошо работает. То есть сортирует элементы по x.
C++
1
2
3
4
5
6
7
8
class Compare
{
public:
    bool operator()(Point_in_Space const& lhs, Point_in_Space const& rhs) const
{
    return  a.x < b.x;
}
}
Однако при добавлении условий сравнения следующим образом выдает ошибку "invalid comparator":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool operator()(Point_in_Space const& lhs, Point_in_Space const& rhs) const
{
    if (lhs.x < rhs.x)
    {
        return  lhs.x < rhs.x;
    }
    else
    {
        if (lhs.y < rhs.y)
        {
            return lhs.y < rhs.y;
        }
        else
        {
            if (lhs.z < rhs.z)
            {
                return lhs.z < rhs.z;
            }
        }
    }
}
Что я делаю неправильно? Не смог найти ни в чем ошибка, ни похожих примеров для функции сравнения...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.06.2020, 19:00
Ответы с готовыми решениями:

Поместить вектора в map и реализовать перегрузку вывода для map
Всем привет! Нужна помощь в написании программы. У меня есть вот такая прога и мне нужно каким-то образом поместить вектора в map и...

Функция Compare для стандартной сортировки
Имеется стандартная сортировка, использующая функцию mysorted sort(tasks.begin(), tasks.end(), mysorted); Вот один прототип функции...

Контейнерный класс map
Никак не могу понять как написать программу на С++, вот задание: Написать программу моделирования работы автобусного парка. Сведения о...

9
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
06.06.2020, 20:36
Цитата Сообщение от Victor_2020 Посмотреть сообщение
Необходимо чтобы в map точки сначала сортировались по x, если x равны, то по y, а если и y равны, то по z.
C++
1
2
3
4
5
6
7
8
class Compare
{
public:
    bool operator()(Point_in_Space const& lhs, Point_in_Space const& rhs) const
    {
        return std::tie(a.x, a.y, a.z) < std::tie(b.x, b.y, b.z);
    }
};
Добавлено через 2 минуты
Цитата Сообщение от Victor_2020 Посмотреть сообщение
Что я делаю неправильно? Не смог найти ни в чем ошибка, ни похожих примеров для функции сравнения...
Ты ж вроде описал условие словами, что твой код совсем ему не соответствует
1
22 / 16 / 7
Регистрация: 06.06.2020
Сообщений: 56
08.06.2020, 11:10  [ТС]
oleg-m1973,
Спасибо.
Сделал так. Однако появилась другая проблема - первый элемент добавляется, а при попытке добавить новый элемент ничего не добавляется... Почитал по интернету, вроде проблема в индексации. Сделал новый класс, в котором переопределил оператор []:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Map_3D :public std::map<Point_in_Space,double,Compare>
{
    map<Point_in_Space, double, Compare> map_3D;
public:
    
    Map_3D()
    { 
        this->map_3D.emplace(Point_in_Space(), 0);      
    };
 
    double& operator[](const Point_in_Space& key) 
    {
        return map_3D[key];
    };
};
Однако это не помогло. Пробовал даже в конструкторе по умолчанию добавлять, добавляется только первый элемент и всё.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.06.2020, 11:14
Цитата Сообщение от Victor_2020 Посмотреть сообщение
Сделал так. Однако появилась другая проблема - первый элемент добавляется, а при попытке добавить новый элемент ничего не добавляется... Почитал по интернету, вроде проблема в индексации. Сделал новый класс, в котором переопределил оператор []:
А координаты точек точно разные?
И покажи весь код
0
22 / 16 / 7
Регистрация: 06.06.2020
Сообщений: 56
08.06.2020, 16:42  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А координаты точек точно разные?
Да.

из мэйна:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <algorithm> 
#include <map>
 
#include "Points.h"
 
using namespace std;
 
int main()
{   
    Map_3D map_3d;
    map_3d.emplace(Point_in_Space(8, 5, 5), 4);
    map_3d.emplace(Point_in_Space(5, 5, 5), 1);
    map_3d.emplace(Point_in_Space(7, 5, 5), 3);
    map_3d.emplace(Point_in_Space(5, 7, 5), 2);
 
    auto iter = map_3d.begin();
    cout << iter->second << endl;
    ++iter;
    cout << iter->second << endl;
    
    return 0;
}
из Points.h

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
#pragma once
#include <iostream>
#include <tuple>
#include <functional>
#include <map>
 
using namespace std;
 
typedef float required_accuracy;
 
class Point_in_Space
{
protected:
    required_accuracy x;
    required_accuracy y;
    required_accuracy z;
    
public:
    Point_in_Space()
        {
    this->x = 0;
    this->y = 0;
    this->z = 0;
        };
    Point_in_Space
    (
        required_accuracy x,
        required_accuracy y,
        required_accuracy z
    )
        {
           this->x = x;
           this->y = y;
           this->z = z;
        };
    
    friend class Compare;   
    friend class Map_3D;    
};
 
 
class Compare 
{
public: 
    bool operator()(Point_in_Space const& lhs, Point_in_Space const& rhs) const
       {    
            return tie(lhs.x, lhs.y, lhs.z) < tie(lhs.x, lhs.y, lhs.z);
        };
};
 
 
class Map_3D :public std::map<Point_in_Space,double,Compare>
{
    map<Point_in_Space, double, Compare> map_3D;
public: 
    Map_3D()
    { 
        this->map_3D.emplace(Point_in_Space(), 0);      
    };
    double& operator[](const Point_in_Space& key) 
    {
        return map_3D[key];
    };
};
Еще почему-то теряется элемент, который из конструктора по умолчанию должен быть при создании map.

Есть еще какие-то мутные примеры с алокаторами. Но для меня это дремучий лес. Надо читать и разбираться.

Добавлено через 8 минут
Нашел ошибку. Прописал lhs вместо rhs. Теперь вроде всё нормально добавляется.
Однако вопрос куда девается элемент из конструктора по умолчанию остаётся. Хотя это не критично...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.06.2020, 18:52
Цитата Сообщение от Victor_2020 Посмотреть сообщение
Однако вопрос куда девается элемент из конструктора по умолчанию остаётся. Хотя это не критично...
А зачем ты его там добавляешь?
0
22 / 16 / 7
Регистрация: 06.06.2020
Сообщений: 56
08.06.2020, 19:30  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А зачем ты его там добавляешь?
Привычка обнулять и проставлять везде нули... чтобы что-то было и это что-то было нулём.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.06.2020, 19:32
Цитата Сообщение от Victor_2020 Посмотреть сообщение
Привычка обнулять и проставлять везде нули... чтобы что-то было и это что-то было нулём.
Не надо его добавлять, там и так всё что надо обнулено
1
22 / 16 / 7
Регистрация: 06.06.2020
Сообщений: 56
08.06.2020, 19:35  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Не надо его добавлять, там и так всё что надо обнулено
Хорошо. Не буду.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,205
08.06.2020, 20:29
Цитата Сообщение от Victor_2020 Посмотреть сообщение
Однако при добавлении условий сравнения следующим образом выдает ошибку "invalid comparator":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool operator()(Point_in_Space const& lhs, Point_in_Space const& rhs) const
{
    if (lhs.x < rhs.x)
    {
        return  lhs.x < rhs.x;
    }
    else
    {
        if (lhs.y < rhs.y)
        {
            return lhs.y < rhs.y;
        }
        else
        {
            if (lhs.z < rhs.z)
            {
                return lhs.z < rhs.z;
            }
        }
    }
}
Что я делаю неправильно?
А вы разве невооруженным взглядом не видите, что в вашем компараторе не все пути выполнения даже возвращают осмысленное значение? Это не может работать правильно и это сразу бросается в глаза.

Стандартный "шаблон" для написания лексикографического компаратора будет выглядеть так

C++
1
2
3
4
5
6
7
8
9
10
bool operator()(Point_in_Space const& lhs, Point_in_Space const& rhs) const
{
  if (lhs.x != rhs.x)
    return lhs.x < rhs.x;
  if (lhs.y != rhs.y)
    return lhs.y < rhs.y;
  if (lhs.z != rhs.z)
    return lhs.z < rhs.z;
  return false;
}
Начиная С++20 для автоматической генерации операторов сравнения в класс Point_in_Space достаточно будет добавить

C++
1
    auto operator <=>(const Point_in_Space &) const = default;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.06.2020, 20:29
Помогаю со студенческими работами здесь

Класс с полем типа map
Привет, можно ли сделать класс с полем типа map&lt;int,int&gt;? У меня это сделать не получается - подскажите как!

Map и собственный класс: GCC ругается
Что я делаю не так? Мэйн: int main() { string s = &quot;abc&quot;; map&lt;string, ConfigSection&gt; sectionList; sectionList =...

Map: обращение к значению (класс) через []
Всем добрый день. Подскажите пожалуйста почему в 14 строчке без пустого конструктора пример не компилится ? Ведь я обращаюсь к объекту...

В чем разница при объявлении методов Compare(.) и IComparer.Compare(.)
Здравствуйте. У меня вопрос, связанный с реализацией методов сравнения, которые используются далее в методе сортировки. Тривиальный пример...

Обращение к элементам vector, который находится в map, находящийся в map
Всем добрый день! Имеется такой контейнер. Как обращаться к элементам вектора и как пушбэчить его? map...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru