Lösung oder Alternative zur rekursiven Ansicht

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Lösung oder Alternative zur rekursiven Ansicht

by Anonymous » 27 Feb 2025, 03:58

Wir möchten einen Baum mit Elementen implementieren: < /p>

Code: Select all

       +----------------------+
|   Item (interface)   |
+----------------------+
| + getName(): string  |-----------+
+----------------------+           |
^                     |
|                     |
+------+------+              |
|             |              |
+-------------+      +------------+    |
| SimpleItem  |      |   Group    |--+
+-------------+      +------------+
| +add(Item) |
| +all()     |
+------------+
Die Group :: All () Funktion muss eine abgeflachte rekursive Ansicht aller Elemente wie Selbstpaare zurückgeben: {Recursion Level, Element}. Elemente ist nicht der gleiche Typ wie Eine Ansicht der Elemente ).

Code: Select all

auto all(size_t level = 0) const {
return views::concat(
views::single(std::pair(level, shared_from_this())),
views::join(items |
views::transform([level](const auto& item) {
auto group = std::dynamic_pointer_cast(item);
if (group == nullptr) {
return views::single(std::pair{level + 1, item});
}
else {
return group->all(level + 1);
}
})
)
);
}
Code: https://compiler-explorer.com/z/fdc8rswae
Jede Idee, wie man das alles funktioniert, und die gewünschte Überabansicht von allen überholten Elementen zurückgibt. concat , das nur in C ++ 26 zu std :: ranges hinzugefügt wird. Lösungen können entweder auf std :: Bereiche oder auf Ranges-V3 beruhen.

Top