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

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

12.04.2021, 15:41. Показов 537. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru