-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathvector.h
More file actions
98 lines (80 loc) · 2.23 KB
/
vector.h
File metadata and controls
98 lines (80 loc) · 2.23 KB
1
2
3
4
5
6
7
8
9
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#pragma once
#include <numeric>
#include <algorithm>
#include <functional>
#include <stdexcept>
// Implementacja klasy std::vector
// Autor: Michał Kucharski (M. Kucharskov)
// Wersja: 4.3.1 (z dnia 24.09.2018)
// Wektor posiada inerpolację danych (odczyt wartości pośrednich)
// oraz paradygmat Copy-On-Write optymalizujący zużycie pamięci.
// Funkcje min(), max() są złożoności czasowej O(1)
class vector {
private:
double * _data = nullptr;
size_t _capacity = 0;
size_t _size = 0;
//Przechowywanie indeksów ekstremów
//bool - flaga naruszenia ekstremum
//size_t - indeks wartości ekstremum
std::pair<bool, size_t> _min, _max;
//Copy-On-Write
size_t * _instances;
void checkInstance();
//Funkcje prywatne
bool checkIndex(double);
//Klasa pośrednicząca w dostepie do danych (COW)
class double_proxy {
private:
vector& _v;
size_t _pos;
public:
//Konstruktor
double_proxy(vector&, const size_t);
//Operatory
double_proxy& operator=(const double);
double_proxy& operator=(const double_proxy&);
operator double() const { return _v._data[_pos]; }
};
public:
//Konstrutkor domyślny
explicit vector(size_t = 1);
//Kontruktor inicializujący
explicit vector(std::initializer_list<double>);
//Konstruktor kopiujący
vector(const vector &);
//Konstruktor przenoszący
vector(vector &&);
//Destruktor
~vector();
//Operatory
vector &operator=(const vector &);
bool operator==(const vector &);
double_proxy operator[](size_t);
//Metody const
size_t size() const { return _size; }
size_t capacity() const { return _capacity; }
size_t instances() const { return *_instances; }
bool empty() const { return _size == 0; }
//Metody
double_proxy at(size_t);
void clear();
void erase(size_t);
void insert(size_t, double);
double pop_back();
void push_back(double);
void push_back(std::initializer_list<double>);
void reserve(size_t);
void reverse();
void sort(bool = false);
//Metody stricte matematyczne
double avg();
double interpolate(double);
double max();
double min();
//Iteratory dla range-based for (CPP 11)
double * begin() { return &_data[0]; };
double * begin() const { return &_data[0]; };
double * end() { return &_data[_size]; };
double * end() const { return &_data[_size]; };
};