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