1. C++ / Говнокод #8347

    +1009

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 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();
    	}
    };

    Шаблон из http://govnokod.ru/6415.

    Запостил: Xom94ok, 29 Октября 2011

    Комментарии (11) RSS

    • Где суть, пацаны?
      Ответить
      • Как минимум в operator=.
        Узлу дерева B присваиваются все подузлы другого узла A, при этом в этих подузлах устанавливается ссылка на новый родительский узел B. Но узел А продолжает ссылаться на свои подузлы.
        Ответить
        • Самый сок здесь в другом. Строчка 36 означает, что при копировании любого узла дерева его копия становится "корнем" для всех своих детей, независимо от того, на каком уровне дерева находился оригинал. При этом корнем самой копии становится корень оригинала (строчка 39). Гениально.

          А подузлы-то как раз не берутся из оригинала "как есть" - они копируются вместе с вектором, в котором лежат отнюдь не указатели. Вот только предсказать, каким именно образом они будут копироваться - через конструктор копирования или operator= (которые здесь ведут себя по-разному и оба некорректно) - не очень реально, т.к. быстрый тест показывает, что при присваивании векторов возможно и то, и другое (в зависимости от того, совпадают ли их размеры на момент присваивания). ХЗ, что об этом говорит стандарт (если вообще говорит)...
          Ответить
      • vector<Tree*> Children()
        Тоже говно. Не совсем копия и на замену ей есть итератор.
        Ответить
      • Tree& Root()
        А тут что-то не чисто пацаны...
        Ответить
      • #pragma once
        Где здесь С++? В стандарте такого нет.

        using namespace std;
        За использование в хедере, а тем более в хедере общественной библиотеке парсера ХМL этой строчки - нужно мочить в сортире.
        Ответить
    • Где-то я это уже видел?..
      Ответить
    • показать все, что скрытоЗато С++11!!!!!!!!!11111
      Ответить
    • развидеть это!

      бля, это еще и парсер xml??
      Ответить

    Добавить комментарий