- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#pragma once
#include <vector>
#include <algorithm>
#include <exception>
using namespace std;
template<typename nodeT>
class Tree
{
Tree* root;
Tree(Tree* _root, nodeT value)
: root(_root)
, Node(value)
{
}
vector<Tree> children;
public:
nodeT Node;
Tree(void) : root(nullptr) { }
Tree(const Tree& value)
: children(value.children)
, Node(value.Node)
, root(value.root)
{
}
virtual ~Tree(void) { }
const Tree& operator=(const Tree& value)
{
if(&value != this)
{
children = value.children;
for_each(children.begin(), children.end(), [this](Tree& tree)
{
tree.root = this;
});
Node = value.Node;
root = value.root;
}
return *this;
}
Tree& Root()
{
if(root == nullptr)
{
throw exception("already root");
}
return *root;
}
bool IsRoot() const
{
return root == nullptr;
}
Tree* Push(nodeT node)
{
children.push_back(Tree(this, node));
return &children.back();
}
Tree& operator[](typename vector<Tree>::size_type index)
{
return children[index];
}
vector<Tree*> Children()
{
vector<Tree*> result;
for(vector<Tree>::iterator i = children.begin(); i!=children.end(); i++)
{
result.push_back(&(*i));
}
return result;
}
typename vector<Tree>::iterator begin()
{
return children.begin();
}
typename vector<Tree>::iterator end()
{
return children.end();
}
};
guest 29.10.2011 00:36 # 0
AnimeGovno-_- 29.10.2011 00:53 # −2
Узлу дерева B присваиваются все подузлы другого узла A, при этом в этих подузлах устанавливается ссылка на новый родительский узел B. Но узел А продолжает ссылаться на свои подузлы.
Kirinyale 29.10.2011 19:56 # 0
А подузлы-то как раз не берутся из оригинала "как есть" - они копируются вместе с вектором, в котором лежат отнюдь не указатели. Вот только предсказать, каким именно образом они будут копироваться - через конструктор копирования или operator= (которые здесь ведут себя по-разному и оба некорректно) - не очень реально, т.к. быстрый тест показывает, что при присваивании векторов возможно и то, и другое (в зависимости от того, совпадают ли их размеры на момент присваивания). ХЗ, что об этом говорит стандарт (если вообще говорит)...
SmackMyBitchUp 29.10.2011 20:54 # +1
AnimeGovno-_- 29.10.2011 00:55 # −3
Тоже говно. Не совсем копия и на замену ей есть итератор.
AnimeGovno-_- 29.10.2011 00:57 # −3
А тут что-то не чисто пацаны...
AnimeGovno-_- 29.10.2011 01:01 # −1
Где здесь С++? В стандарте такого нет.
using namespace std;
За использование в хедере, а тем более в хедере общественной библиотеке парсера ХМL этой строчки - нужно мочить в сортире.
AnimeGovno-_- 29.10.2011 00:43 # −4
AnimeGovno-_- 29.10.2011 00:58 # −6
defecate-plusplus 29.10.2011 01:04 # +4
бля, это еще и парсер xml??
actuator 29.10.2011 06:49 # +5