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

    +152

    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
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    template<typename T> class myVector {
    private:
    	T* data; // Указатель на массив с данными
    	int count; //Кол-во элементов в векторе
    	T maxv, minv; // Максимальный и минимальный элементы
    	void quicksort(T a[], const int& leftarg, const int& rightarg) const // Сортировочка
    	{
    		if (leftarg < rightarg) {
    			T pivotvalue = a[leftarg];
    			int left = leftarg - 1;
    			int right = rightarg + 1;
    			for(;;) {
    
    				while (a[--right] > pivotvalue);
    				while (a[++left] < pivotvalue);
    				if (left >= right) break;
    				T temp = a[right];
    				a[right] = a[left];
    				a[left] = temp;
    			}
    			int pivot = right;
    			quicksort(a, leftarg, pivot);
    			quicksort(a, pivot + 1, rightarg);
    		}
    	}
    public:
    	myVector() : count(0), data(0), maxv(0), minv(0) // Я хз какие дефолтные значения задавать maxv и minv
    	{
    	}
    	~myVector() //Деструктор
    	{
    		if (data)
    			delete [] data;
    	}
    	void operator<<(const T &Value) //Оператор для добавления элемента в вектор
    	{
    		data = (T*)realloc(data, ++count * sizeof(T));
    		data[count-1] = Value;
    		if (maxv < Value) // Чтобы не искать максимальный и минимальный элемент, чекаем значение при добавлении в массив
    			maxv = Value;
    		else 
    			if (minv > Value)
    				minv = Value;
    	}
    	T& operator[](const int &Index)//Оператор [] для доступа по индексу
    	{
    		if (Index >= count) throw 1;
    		return data[Index];
    	}
    	void orderAsc(T *result) const //Сортировка по возрастанию
    	{
    		if (!data) throw 1;
    		memcpy(result, data, sizeof(T) * count);
    		quicksort(result, 0, count - 1);
    	}
    	void orderDesc(T *result) const
    	{
    		if (!data) throw 1;
    		memcpy(result, data, sizeof(T) * count);
    		quicksort(result, 0, count - 1);
    		int swap, b = count;
    		for(int a = 0; a < --b; a++) {
    			swap = result[a];  result[a] = result[b]; result[b] = swap; 
    		}
    	}
    	T max() const
    	{
    		if (!data) throw 1;
    		return maxv;
    	}
    	T min() const
    	{
    		if (!data) throw 1;
    		return minv;
    	}
    };
    int main()
    {
    	myVector<int> v;
    	for (int i = 0; i < 10; i++)
    		v << rand() % 100; // Заполняем рандомными элементами
    	for (int i = 0; i < 10; i++)
    		printf("%d ", v[i]); // Выводим их
    	printf("\n");
    	int *arr = new int[10];
    	v.orderAsc(arr); //Сортируем по возрастанию
    	for (int i = 0; i < 10; i++)
    		printf("%d ", *(arr + i)); //Выводим результат
    	printf("\n");
    	v.orderDesc(arr); //Сортируем по убыванию
    	for (int i = 0; i < 10; i++)
    		printf("%d ", *(arr + i));//Выводим результат
    	printf("\n%d\n%d", v.max(), v.min()); //Выводим максимальный и минимальный элементы
    	delete [] arr;
    }

    Типа вот внезапно так захотелось создать простейший класс вектора. До STL-ного далеко

    Запостил: JC_NVKZ, 20 Июля 2010

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

    • Деструктор определён, а оператор присваивания и копирования не определены - это фэйл ( http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0% BE_%D1%82%D1%80%D1%91%D1%85_(C%2B%2B_%D0 %BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC% D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%B D%D0%B8%D0%B5) ).

      При модификации элементов вектора (а модифицировать можно, т.к. operator [] возвращает не константную ссылку) minv и maxv не обновятся.

      Остальное смотреть лень
      Ответить
      • тьфу блин парсер тупит http://en.wikipedia.org/wiki/Rule_of_three_(C++_programming)
        Ответить
      • + Нет работы с константным объектом, к примеру
        T operator[](const int &Index) const;
        Использование memcpy для работы с элементами это тоже сильно.
        Использование malloc, realloc, free и подобных в С++ я бы сказал плохой тон, при условии, что без них тут все обходится отлично.

        Короче таков переход с C на С++, посоветовал бы читать матчасть сначала.
        Ответить
        • const T& operator[](const int Index) const;
          Ответить
          • а зачем к POD типу передаваемому не по ссылке const? gcc к примеру даже варнинг кинет на это. А по возвращаемому значению точно.
            Ответить
            • Хм...
              Насчёт const int - просто как-то приятнее везде, где возможно писать const, тогда сразу видно, что везде где используется эта переменная будет именно это значение, не нужно искать по коду, где же она модифицировалась.

              Ну и к тому же если этот параметр не модифицируется, то зачем его делать не const? К примеру если случайно написать вместо if(x == 0) => if(x = 0), то const очень даже поможет выявить ошибку.

              Насчёт const T& - какие проблемы? Передавать по значению не круто, так как T может быть очень большой структурой, передавать по неконстантной ссылке нельзя, т.к. метод const, остаётся только так. Единственной проблемой может быть то, что если сохранить эту ссылку в переменную типа const T&, потом удалить вектор, то при обращении к переменной будет хз что, но... тут скорее проблемы языка или пользователя, а не метода.

              Насчёт warnings - такой код компилировался g++ со всеми включенными ворнингами (а именно -W -Wall -Wextra -pedantic -Weffc++ -Woverloaded-virtual -Wctor-dtor-privacy -Wnon-virtual-dtor -Wold-style-cast -Wconversion -Winit-self -Werror), и всё было тихо.
              Ответить
              • Вот если что как я писал вектор: [url]http://code.google.com/p/burdakovd/source/browse/trunk/c%2B%2B/sdl/sdlapplication/Vector.h[/url]
                Ответить
    • ещё бы не мешало конструктор копированию и операторов больше)
      и ещё непонятен мне сортировки в классе vector, если ты не сортируешь этот вектор, а какой-то массив абсолютный левый?
      и всё же, лучше в самом классе использовать только объявления, а определния функций ниже

      class test
      {
      int value;
      test (int = 0);
      };
      
      test::test (int _value): value (_value) {}


      как пример

      и ещё можно было твой класс вынести в отдельный .h файл, т.к. шаблоны нельзя разграничвать отдельно объявление в .h а реализация в .cpp, то весь твой класс в .h ;)
      Ответить
      • не так выразился насчёт сортировки, т.е. зачем выделяешь ещё дополнительный объём памяти? ведь посвользоваться этим же, только не const функция получится
        Ответить
    • Зачем if (minv > Value) прятать в else? При например одном элементе в векторе minv == maxv.
      realloc можно покруче сделать (размер увеличивать в 2 раза по необходимости)
      Внезапно int swap;
      Ответить

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