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

Сортировка в виде иерархии

12.04.2021, 15:41. Показов 563. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть у меня значит способ создания иерархии
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
void Application::buildTree1()
{
 string parent_name, child_name;
 cin >> parent_name;
 setName(parent_name);
 
 temp_parent = this;
 do {
 cin >> parent_name;
 if(parent_name == "endtree")
    return;
 cin >> child_name >> cl >> ready;
 
 if (parent_name != temp_parent -> getName()) {
 if (parent_name == temp_child -> getName()) {
 temp_parent = temp_child;
 } //else continue;
 }
 switch (cl)
 {
 case 2:
    temp_child = new cl2(temp_parent, child_name, ready);
    break;
 case 3:
    temp_child = new cl3(temp_parent, child_name, ready);
 }
 
 } while (true);
}
Принадлежность к классам пока ни на что не влияет, они идентичны. Суть в том, что мы запихиваем их в вектор

C++
1
cl2 :: cl2 (Base* parent, std::string name, int ready) : Base(parent,name,ready) {}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Base::Base(Base* parent, string name, int ready)
{
    setParent(parent);
    setName(name);
    setReady(ready);
}
void Base::setName(string name) {
 this -> name = name;
 outfile << name << " ";
}
void Base::setParent(Base* parent) {
 this -> parent = parent;
 if (parent) {
 parent->children.push_back(this);
 
 }
}
void Base::setReady(int ready)
{
    this -> ready = ready;
}
В вектор мы их запихиваем просто по порядку, и выводиться они будут соответствующе

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Base::printReady()
{
    if(children.empty()) return;
    children_iterator = children.begin();
    while (children_iterator != children.end())
    {
        cout << "The object " << (*children_iterator) -> getName();
        if((*children_iterator)->getReady()==-1)
            cout << " is not ready" << endl;
        else
            cout << " is ready" << endl;
        children_iterator++;
    }
    children_iterator--;
    (*children_iterator) -> printReady();
}
А мне нужен вывод именно в иерархическом порядке, пока что придумал только сделать функцию сортировки, но она получается какая-то страшная и огромная, и мне так и не удалось заставить её работать...

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
void Base::sortTree()
{
    Base* temp_parent;
    Base* temp_child;
    children_iterator = children.begin();
    children_iterator++;
    temp_parent = this;
    while(children_iterator != children.end())
    {
        if((*children_iterator)->getParent()==temp_parent)
        {
            temp_child = this;
            break;
        }
        children_iterator++;
    }
    children_iterator = children.begin();
    while(children_iterator != children.end())
    {
        if(this == temp_child->getParent())
        {
            children.insert(children_iterator+1,temp_child);
            children_iterator++;
            break;
        }
        children_iterator++;
    }
    while(children_iterator != children.end())
    {
        if(*children_iterator == temp_child)
        {
            children.erase(children_iterator);
        }
        children_iterator++;
    }
}
Как мне решить данную проблему?
Ввод должен быть следующим:
Code
1
2
3
4
5
6
7
8
9
app_root
app_root object_1 3 1
app_root object_2 2 1
object_2 object_4 3 -1
object_2 object_5 3 1
app_root object_3 3 1
object_2 object_6 2 1
object_1 object_7 2 1
endtree
Где сначала мы пишем родителя, потом ребёнка, потом принадлежность к классу и готовность
И мне нужен следующий вывод:
Code
1
2
3
4
5
6
7
8
The object app_root is ready
The object object_1 is ready
The object object_7 is ready
The object object_2 is ready
The object object_4 is not ready
The object object_5 is ready
The object object_6 is ready
The object object_3 is ready
А выводит мне:

Code
1
2
3
4
5
6
7
The object object_1 is ready
The object object_2 is ready
The object object_4 is not ready
The object object_5 is ready
The object object_3 is ready
The object object_6 is ready
The object object_7 is ready
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.04.2021, 15:41
Ответы с готовыми решениями:

Вывод таблицы в виде иерархии
Есть таблица: ID | parent_id | name | lvl | fullpath 1 | null | книги | 1 | 00001 2 | null | лк | 1 | 00002 3 | 1 | детективы |...

Как вывести таблицу в виде иерархии?
есть база |id|url|category| ------------------- 0|rrr|no| 1|test|no| 2|blabla|test| 3|mr|test| 4|ml|blabla| Как можно...

Сортировка в иерархии
Привет всем! После создания иерархии возникла проблема с сортировкой. public class Plane : Aerotechnics { private...

1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.04.2021, 17:38
Цитата Сообщение от David_G Посмотреть сообщение
Как мне решить данную проблему?
Рекурсивный обход дерева, например.
Цитата Сообщение от David_G Посмотреть сообщение
Ввод должен быть следующим
...
И мне нужен следующий вывод
Набросал упрощённый пример:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <vector>
#include <memory>
 
struct Node
{
    typedef std::unique_ptr<Node> NodePtr;
    
    Node * m_parent;
    std::vector<NodePtr> m_child;
    std::string m_name;
    int m_ready;
    
    Node(std::string name, int ready)
        : m_parent(nullptr)
        , m_name(std::move(name))
        , m_ready(ready)
    {}
    
    void addChild(NodePtr ptr)
    {
        m_child.push_back(std::move(ptr));
        m_child.back()->m_parent = this;
    }
    
    // рекурсивный обход, пока visitor не вернёт true
    template<class Visitor>
    bool visitUntil(Visitor && v)
    {
        if (!v(*this))
        {            
            for (auto && child : m_child)
                if (child && child->visitUntil(std::forward<Visitor>(v)))
                    return true;
        }
        return false;
    }
};
 
// поиск с предикатом
template<class Pred>
Node * findIf(Node * tree, Pred p)
{
    Node * result = nullptr;
    if (tree)
    {
        auto searcher = [&](Node & val) -> bool {
            if (p(val))
                result = &val;
            return result;
        };
        tree->visitUntil(searcher);
    }
    return result;
}
 
// ввод
Node::NodePtr buildTree()
{
    std::string parent, child;
    int ready, cl;
    std::cin >> parent;
    auto root = std::make_unique<Node>(parent, 1);
    for (; std::cin >> parent && parent != "endtree";)
    {
        Node * p = findIf(root.get(), [&parent](const Node & val) { return parent == val.m_name; });
        if (p && std::cin >> child >> cl >> ready)
            p->addChild(std::make_unique<Node>(child, ready));
        else
            break;
    }
    return root;
}
 
// вывод
void printTree(Node * tree)
{
    if (tree)
    {
        auto printer = [](Node & val) -> bool {
            std::cout << "Object " << val.m_name
                      << " is" << (val.m_ready == -1 ? " not " : " ")
                      << "ready\n";
            return !std::cout;
        };
        tree->visitUntil(printer);
    }
}
 
int main()
{
    auto tree = buildTree();
    printTree(tree.get());
}

https://wandbox.org/permlink/PLmw1017us77mAMe
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.04.2021, 17:38
Помогаю со студенческими работами здесь

Сортировка списка по иерархии
Здравствуйте! Хотелось бы узнать, как создать &quot;жесткую&quot; сортировку в списке? у меня имеется список людей, у каждого человека известно какой...

Как наглядно представить код в виде иерархии классов и связей между ними
Желательно видеть как внутренние связи, между всеми методами, в том числе и обращения к переменным, так и внешние, между всеми элементами....

Сортировка последних вхождений иерархии с зависимостью от предков
Здравствуйте! В общем проблемка, нужно отсортировать последние элементы массива в зависимости от положений всех предков... Имеется массив с...

Сортировка в виде
В виде сортирую колонку Номер. Сортирирую колонку и получается, что вначале идут документы 1, 11, 12..... , 2, 21,22... А надо чтобы шли...

Сортировка в виде
Всем привет! В виде сортировка скачет непонятным образом. Используются украинские символы. В некоторый момент времени сервер...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru