array¶
ソースコード¶
1#include <iostream>
2#include <vector>
3#include <algorithm>
4#include <cassert>
5using namespace std;
6
7namespace titan23 {
8
9 template<typename T>
10 class Array {
11 private:
12 vector<T> a;
13
14 public:
15 Array() {}
16 Array(const int n) : a(n) {}
17 Array(const int n, const T &key) : a(n, key) {}
18 Array(const vector<T> &v) : a(v) {}
19
20 void emplace_back(const T key) {
21 a.emplace_back(key);
22 }
23
24 void resize(const int n, const T &e) {
25 assert(n >= 0);
26 a.resize(n, e);
27 }
28
29 void reserve(const int n) {
30 assert(n >= 0);
31 a.reserve(n);
32 }
33
34 T sum(T e) const{
35 T s = e;
36 for (const T &x: a) s += x;
37 return s;
38 }
39
40 bool empty() const {
41 return len() == 0;
42 }
43
44 void sort(bool reverse=false) {
45 if (reverse) {
46 std::sort(a.rbegin(), a.rend());
47 } else {
48 std::sort(a.begin(), a.end());
49 }
50 }
51
52 int index(T &key) const {
53 for (int i = 0; i < len(); ++i) {
54 if (a[i] == key) return i;
55 }
56 return -1;
57 }
58
59 int count(const T &key) const {
60 int cnt = 0;
61 for (const T &x: a) {
62 if (x == key) ++cnt;
63 }
64 return cnt;
65 }
66
67 void clear() {
68 a.clear();
69 }
70
71 void insert(const int i, const T &key) {
72 assert(0 <= i && i <= len());
73 a.insert(a.begin()+i, key);
74 }
75
76 T pop(int i=-1) {
77 if (i < 0) i += len();
78 T key = a[i];
79 a.erase(a.begin() + i);
80 return key;
81 }
82
83 void remove(T &key) {
84 std::remove(a.begin(), a.end(), key);
85 }
86
87 void reverse() {
88 int n = len() >> 1;
89 for (int i = 0; i < n; ++i) {
90 swap(a[i], a[n-i-1]);
91 }
92 }
93
94 void reverse(int l, int r) {
95 // reverse([l, r))
96 int n = len();
97 assert(0 <= l && l <= r && r <= n);
98 --r;
99 for (int i = 0; i < ((r+1-l)>>1); ++i) {
100 swap(a[l+i], a[r-i]);
101 }
102 }
103
104 void swap(const int i, const int j) {
105 assert(0 <= i < len());
106 assert(0 <= j < len());
107 swap(a[i], a[j]);
108 }
109
110 void swap_range(int l0, int r0, int l1, int r1) {
111 // swap([l0, r0), [l1, r1))
112 // O(n)
113 if (r0 > l1) {
114 swap(l0, l1);
115 swap(r0, r1);
116 }
117 assert(l0 <= r0);
118 assert(r0 <= l1);
119 assert(l1 <= r1);
120 vector<T> b = a;
121 a.erase(a.begin()+l1, a.begin()+r1);
122 a.erase(a.begin()+l0, a.begin()+r0);
123 a.insert(a.begin()+l0, b.begin()+l1, b.begin()+r1);
124 a.insert(a.begin()+r1-(r0-l0), b.begin()+l0, b.begin()+r0);
125 }
126
127 Array<T> copy() const {
128 Array<T> res(a);
129 return res;
130 }
131
132 bool contain(T &key) const {
133 for (const T &x: a) {
134 if (x == key) return true;
135 }
136 return false;
137 }
138
139 T& operator[] (const int i) {
140 assert(-len() <= i && i < len());
141 return a[i<0? i+len(): i];
142 }
143
144 T operator[] (const int i) const {
145 assert(-len() <= i && i < len());
146 return a[i<0? i+len(): i];
147 }
148
149 int len() const {
150 return (int)a.size();
151 }
152
153 vector<T> tovector() const {
154 vector<T> res = a;
155 return res;
156 }
157
158 void print() const {
159 cout << "[";
160 for (int i = 0; i < len()-1; ++i) {
161 cout << a[i] << ", ";
162 }
163 if (len() > 0) {
164 cout << a.back();
165 }
166 cout << "]\n";
167 }
168
169 void pprint(string sep=" ", string end="\n") {
170 for (int i = 0; i < len()-1; ++i) {
171 cout << a[i] << sep;
172 }
173 if (len() > 0) {
174 cout << a.back();
175 }
176 cout << end;
177 }
178 };
179} // namespace titan23
仕様¶
Warning
doxygenfile: Cannot find file “titan_cpplib/data_structures/array.cpp