170 похожих чатов

Доброго дня. Есть структура Node вида узел=>потомки(узлы), потомки хранятся в

vector, узлы могут быть разного вида, N1 и N2, наследуются от Node, потом используются в Tree, в которой лежит корень дерева. Надо сделать контейнер для хранения потомков универсальным, чтобы можно было не только в vector хранить, а в list, deque или в собственном. Сейчас пытаюсь добавить в параметры Node для контейнера template<typename, typename...> class Container, typename... Params и потомков хранить в Container<std::shared_ptr<T<TIndex>>, Params...> children;. Но проблема с наследованием для N1 и N2. Подскажите, пожалуйста, как это правильно сделать, и как создавать объекты типа Tree с указанием контейнера для хранения узлов.
template <template <typename> class T, typename TIndex>
struct Node
{
TIndex index;
std::vector<std::shared_ptr<T<TIndex>>> children;
Node() : index(0) { }
};

template <typename TIndex>
struct N1: public Node<N1, TIndex>
{
N1() : Node<N1, TIndex>() {}
};

template <typename TIndex>
struct N2: public Node<N2, TIndex>
{
size_t count;
N2() : Node<N2, TIndex>(), count(0) {}
};

template <typename TNode> // можно N1 или N2 использовать
struct Tree
{
std::shared_ptr<TNode> root;
Tree()
{
root = std::make_shared<TNode>();
}
};
//Tree<N1<int>> obj; // или Tree<N2<int>>
//std::cout << obj.root->index << std::endl;

template<template <typename> class T, typename TIndex, template<typename, typename...> class Container, typename... Params>
struct NewNode
{
TIndex index;
Container<std::shared_ptr<T<TIndex>>, Params...> children;
NewNode() : index(0) { }
};
// а как создать NewN1 и NewN2 от NewNode а затем использовать при создании Tree?

48 ответов

8 просмотров

Ты круто заморочился, респект

Serg-Psv Автор вопроса
Anatoly Shirokov
Ты круто заморочился, респект

А это вообще реализуемо? Функцию, которая принимает любой контейнер ведь можно создать. Почему класс не создать

Serg Psv
А это вообще реализуемо? Функцию, которая принимае...

а у тебя в любой ноде может быть любой контейнер?

Serg-Psv Автор вопроса
disba1ancer
а у тебя в любой ноде может быть любой контейнер?

не, во всех одинаковый, только при создании дерева указывать какой контейнер использовать

Serg Psv
не, во всех одинаковый, только при создании дерева...

аааа, не думал указывать аргументом шаблона?

Serg Psv
А это вообще реализуемо? Функцию, которая принимае...

Функцию, которая может принимать любой контейнер, не создать.

Serg-Psv Автор вопроса
Ilya Zviagin
Функцию, которая может принимать любой контейнер, ...

а как же так? template<template<typename, typename...> class Container, class T, typename... Params> void f(Container<T, Params...> const& u) { std::cout << u.size() << std::endl; } int main() { std::vector<int> a(10, 1); std::list<int> b(10, 1); f(a); f(b); }

Вообще, узлам дерева не нужно быть разного типа. Содержимому узлов -- можно. А самим узлам - нет смысла, вроде бы. Ну или я что-то не понимаю

Serg-Psv Автор вопроса
Ilya Zviagin
Где функция то?

я ведь могу в аргументы передать любого вида контейнер?

Serg-Psv Автор вопроса
Ilya Zviagin
Вообще, узлам дерева не нужно быть разного типа. С...

тут идея такая, хранить список узлов в контейнере который определишь сам при создании дерева.

Serg-Psv Автор вопроса
Serg-Psv Автор вопроса
Ilya Zviagin
В функцию - не можешь

в шаблон функции могу?

Serg-Psv Автор вопроса
Serg Psv
через итераторы планировал

Не все так просто. Меерса читал?

Serg-Psv Автор вопроса
Ilya Zviagin
А смысл?

хотел переехать с vector на свой контейнер, но не хотел портить весь остальной функционал, работа внутри в основном через стандартные stl алгоритмы

Serg-Psv Автор вопроса
Ilya Zviagin
Не все так просто. Меерса читал?

нет)) в какой из книг, подскажите

Serg Psv
хотел переехать с vector на свой контейнер, но не ...

ну так в чем проблема, у тебя же уже есть template <typename> class T таким же параметром добавь контейнер

Serg Psv
хотел переехать с vector на свой контейнер, но не ...

Вообще, ты делаешь дерево. Зачем все узлы хранить в одном контейнере? Я не очень понимаю.

Serg Psv
нет)) в какой из книг, подскажите

В первой. Хотя, может в той что про STL. Глава называется "остерегайтесь писать контейнеро-независимый код"

Serg-Psv Автор вопроса
Serg-Psv Автор вопроса
Ilya Zviagin
В первой. Хотя, может в той что про STL. Глава на...

во, спасибо, гляну, походу это как раз выстрел в ногу у меня

Serg-Psv Автор вопроса
Serg Psv
во, спасибо, гляну, походу это как раз выстрел в н...

Короче не делай так. В принципе есть разные контейнеры это - массивы - списки - словари Они в работе принципиально разные.

Serg Psv
так их много, не два, нужен контейнер

Зачем? В каком месте дерева, общения с ним, нужен общий контейнер, хранящий все узлы в одном месте?

Ilya Zviagin
Зачем? В каком месте дерева, общения с ним, нужен ...

а где там узлы в одном месте то? Там в контейнере вроде sptr на ноду (рут), а каждая нода хранит как раз N нод, т.к. просто дерево в общем случае, не бинарное

Serg-Psv Автор вопроса
Ilya Zviagin
Короче не делай так. В принципе есть разные контей...

Понял, я почитаю. С контейнерами знаком, и сложность при работе с итераторами там разная, просто не хотел менять везде vector, а указать как параметром

Serg Psv
так их много, не два, нужен контейнер

По сути дерево - это двумерный список. В списке все узлы не хранятся в одном контейнере. Почему в дереве должны?

Denis P
а где там узлы в одном месте то? Там в контейнере ...

Так я не знаю, вот человек такое писать хочет...

Ilya Zviagin
Так я не знаю, вот человек такое писать хочет...

ну в его самом первом примере вроде всё ок было )

Serg-Psv Автор вопроса
Denis P
а где там узлы в одном месте то? Там в контейнере ...

Да, в общем виде: узел->массив потомков такого же типа

Serg-Psv Автор вопроса
Ilya Zviagin
По сути дерево - это двумерный список. В списке вс...

не понял)) можно оптимальнее хранить дерево общего вида?

Ну вот он... Я лично слабо понимаю зачем это все.

Serg Psv
не понял)) можно оптимальнее хранить дерево общего...

Ты пишешь дерево, так? И хочешь все узлы дерева помимо хранения в дереве также хранить ещё и в каком-то контейнере, так?

Ilya Zviagin
Ну, скажи мне...

ну двумерный список это все-таки плоская сетка

Serg-Psv Автор вопроса
Ilya Zviagin
Ты пишешь дерево, так? И хочешь все узлы дерева по...

нее, я просто хотел при создании дерева указать в каком из контейнеров должен храниться список дочерних узлов

Serg-Psv Автор вопроса
Ilya Zviagin
Ты пишешь дерево, так? И хочешь все узлы дерева по...

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

Serg Psv
нее, я просто хотел при создании дерева указать в ...

А, понял. Там надо либо вектор, либо список, либо просто что-то своё, если узлы разного типа, наверное просто сделать динамический массив указателей

Serg Psv
ладно, господа, походу главный вопрос был действит...

Тут есть такая большая тонкость с ковариантностями за косвенностью, Base** не связано с Derived**, пока не довешан const. В случае с деревом это примерно означает, что полиморфный узел дерева может только разрешать перечислить потомков, но не может напрямую давать их изменять. Пример на подумать void f(Derived** ppderived) { Base** ppbase = reinterpret_cast<Base**>(ppderived); //C++ понимает эту тонкость и запрещает такие неявные касты *ppbase = new Base(); //*ppderived теперь не Derived }

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта