优先级队列  0.1
数据结构_第7章
seqList.h
Go to the documentation of this file.
1 
14 #ifndef __seqListIncluded
15 #define __seqListIncluded
16 
17 #include "List.h"
18 #include <initializer_list>
19 #include <iostream>
20 
21 namespace List
22 {
23  // 顺序表类的定义
24  template <typename T>
25  class seqList : public List<T>
26  {
27  private:
28  T *data;
29  size_t currentLength;
30  size_t maxSize;
31  void doubleSpace(); // 扩大数组空间
32  public:
34  {
35  public:
36  const_iterator() : current(nullptr) {}
37  virtual const T &operator*() const { return *current; }
39  {
40  ++current;
41  return *this;
42  }
44  {
45  const_iterator old = *this;
46  ++current;
47  return old;
48  }
50  {
51  --current;
52  return *this;
53  }
55  {
56  const_iterator old = *this;
57  --current;
58  return old;
59  }
60 
61  virtual bool operator==(const const_iterator &rhs) const { return rhs.current == current; }
62  virtual bool operator!=(const const_iterator &rhs) const { return rhs.current != current; }
63 
64  protected:
65  T *current;
66 
67  const_iterator(T *p) : current(p) {}
68 
69  friend seqList<T>;
70  };
71 
72  class iterator : public const_iterator
73  {
74  public:
75  virtual T &operator*() { return *iterator::current; }
76  virtual const T &operator*() const { return const_iterator::operator*(); } // 防止被派生类mutator覆盖
77  virtual iterator &operator++()
78  {
80  return *this;
81  }
82 
84  {
85  iterator old = *this;
87  return old;
88  }
89 
90  virtual iterator &operator--()
91  {
93  return *this;
94  }
95 
97  {
98  iterator old = *this;
100  return old;
101  }
102  // 与基类相同
103  // virtual bool operator==(const iterator &rhs) const;
104  // virtual bool operator!=(const iterator &rhs) const;
105  protected:
106  iterator(T *p) : const_iterator(p) {}
107 
108  friend seqList<T>;
109  };
110 
111  public:
117  seqList(size_t initSize = 10);
118 
124  seqList(const seqList<T> &rhs);
125 
131  seqList(seqList<T> &&rvalue);
132 
138  seqList(const std::initializer_list<T> &init_list);
139 
144  virtual ~seqList();
145 
146  virtual void clear(); // 删除线性表中所有的元素
147  virtual int length() const; // 返回线性表的长度
148  virtual void insert(int i, const T &obj); // 在第i个位置插入一个元素,即新元素的下标将为i
149  virtual void remove(int i); // 删除第i个位置的元素
150  virtual int search(const T &obj) const; // 返回元素obj在线性表中首次出现的下标
151  virtual T visit(int i) const; // 返回线性表中第i个元素
152  virtual void traverse(std::ostream &out = std::cout) const; // 遍历线性表
153 
160  T &operator[](size_t index);
161 
168  const T &operator[](size_t index) const;
169 
175  void push_back(const T &x);
176 
182  void push_back(T &&x);
183 
187  void pop_back();
188 
194  size_t size() const;
195 
207  size_t capacity() const noexcept;
208 
217  T &front();
218 
227  const T &front() const;
228 
237  T &back();
238 
247  const T &back() const;
248 
255  void resize(size_t n);
256 
269  void reserve(size_t n);
270 
278  friend std::ostream &operator<<(std::ostream &out, const seqList &obj)
279  {
280  obj.traverse(out);
281  return out;
282  }
283 
284  virtual iterator begin() { return iterator(data); } // 数据范围[begin, end)
285  virtual const_iterator begin() const { return iterator(data); }
286  virtual iterator end() { return iterator(data + currentLength); }
287  virtual const_iterator end() const { return iterator(data + currentLength); }
288  };
289 
290  // 顺序表类的实现
291  template <class T>
293  {
294  delete[] data;
295  }
296 
297  template <class T>
299  {
300  currentLength = 0;
301  }
302 
303  template <class T>
304  int seqList<T>::length() const
305  {
306  return currentLength;
307  }
308 
309  template <class T>
310  size_t seqList<T>::size() const
311  {
312  return length();
313  }
314 
315  template <class T>
316  T seqList<T>::visit(int i) const
317  {
318  return data[i];
319  }
320 
321  template <class T>
322  void seqList<T>::traverse(std::ostream &out) const
323  {
324  out << '\n';
325  for (size_t i = 0; i < currentLength; ++i)
326  out << data[i] << ", ";
327 
328  out << std::endl;
329  }
330 
331  template <class T>
332  seqList<T>::seqList(size_t initSize)
333  {
334  data = new T[maxSize = initSize];
335  currentLength = 0;
336  }
337 
338  template <class T>
339  seqList<T>::seqList(const std::initializer_list<T> &init_list)
340  : currentLength{init_list.size()}, maxSize{2 * init_list.size()}
341  {
342  data = new T[maxSize];
343  size_t i = 0;
344  for (auto itr = init_list.begin(); itr != init_list.end(); ++itr)
345  {
346  data[i++] = *itr;
347  }
348  }
349 
350  template <class T>
352  : data{rvalue.data}, currentLength{rvalue.currentLength}, maxSize{rvalue.maxSize}
353  {
354  rvalue.data = nullptr;
355  rvalue.currentLength = 0;
356  rvalue.maxSize = 0;
357  }
358 
359  template <class T>
361  : data{new T[rhs.maxSize]}, currentLength{rhs.currentLength}, maxSize{rhs.maxSize}
362  {
363  for (size_t i = 0; i < rhs.maxSize; ++i)
364  data[i] = rhs.data[i];
365  }
366 
367  template <class T>
368  int seqList<T>::search(const T &obj) const
369  {
370  for (size_t i = 0; i < currentLength; ++i)
371  if (data[i] == obj)
372  return i;
373 
374  return -1;
375  }
376 
377  template <class T>
379  {
380  auto oldData = data;
381  data = new T[maxSize *= 2];
382  for (size_t i = 0; i < currentLength; ++i)
383  data[i] = oldData[i];
384 
385  delete[] oldData;
386  }
387 
388  template <class T>
389  void seqList<T>::insert(int i, const T &obj)
390  {
391  if (i == currentLength)
392  doubleSpace();
393 
394  for (int k = currentLength++; k > i; --k)
395  data[k] = data[k - 1];
396 
397  data[i] = obj;
398  }
399 
400  template <class T>
401  void seqList<T>::remove(int i)
402  {
403  --currentLength;
404  for (int k = i; i < currentLength; ++k)
405  data[k] = data[k + 1];
406  }
407 
408  template <class T>
409  seqList<T> operator+(const seqList<T> &A, const seqList<T> &B) // 拼接线性表
410  {
411  seqList<T> C(A.length() + B.length());
412  size_t i = 0;
413  for (size_t k = 0; k < A.length(); ++k)
414  C.insert(i++, A.visit(k));
415 
416  for (size_t k = 0; k < B.length(); ++k)
417  C.insert(i++, B.visit(k));
418 
419  return C;
420  }
421 
422  template <class T>
423  T &seqList<T>::operator[](size_t index)
424  {
425  if (index < 0 || index >= maxSize)
426  throw(std::string{"下标越界"});
427  return data[index];
428  }
429 
430  template <class T>
431  const T &seqList<T>::operator[](size_t index) const
432  {
433  if (index < 0 || index >= maxSize)
434  throw(std::string{"下标越界"});
435  return data[index];
436  }
437 
438  template <class T>
439  void seqList<T>::push_back(const T &x)
440  {
441  if (currentLength > maxSize)
442  doubleSpace();
443  data[currentLength++] = x;
444  }
445 
446  template <class T>
448  {
449  if (currentLength == maxSize)
450  doubleSpace();
451  data[currentLength++] = std::move(x);
452  }
453 
454  template <class T>
456  {
457  --currentLength;
458  }
459 
460  template <class T>
462  {
463  return data[0];
464  }
465 
466  template <class T>
467  const T &seqList<T>::front() const
468  {
469  return data[0];
470  }
471 
472  template <class T>
474  {
475  return data[currentLength - 1];
476  }
477 
478  template <class T>
479  const T &seqList<T>::back() const
480  {
481  return data[currentLength - 1];
482  }
483 
484  template <class T>
485  void seqList<T>::resize(size_t n)
486  {
487  if (n > maxSize)
488  doubleSpace();
489 
490  currentLength = n;
491  }
492 
493  template <class T>
494  size_t seqList<T>::capacity() const noexcept
495  {
496  return maxSize;
497  }
498 
499  template <class T>
500  void seqList<T>::reserve(size_t n)
501  {
502  if (n > maxSize)
503  {
504  T *newArray = new T[maxSize = n];
505  for (size_t i = 0; i < currentLength; ++i)
506  {
507  newArray[i] = std::move(data[i]);
508  }
509  std::swap(data, newArray);
510  delete[] newArray;
511  }
512  }
513 
514 } // namespace List
515 #endif
List::seqList::doubleSpace
void doubleSpace()
Definition: seqList.h:378
List::seqList::capacity
size_t capacity() const noexcept
Return size of allocated storage capacity.
Definition: seqList.h:494
List::seqList::currentLength
size_t currentLength
Definition: seqList.h:29
List::seqList::const_iterator::const_iterator
const_iterator(T *p)
Definition: seqList.h:67
List::seqList::reserve
void reserve(size_t n)
Request a change in capacity.
Definition: seqList.h:500
List::seqList::front
T & front()
Access first element.
Definition: seqList.h:461
List::seqList::remove
virtual void remove(int i)
Definition: seqList.h:401
List::seqList::const_iterator::operator++
const_iterator operator++(int)
Definition: seqList.h:43
List::seqList::end
virtual iterator end()
Definition: seqList.h:286
List::seqList::const_iterator::operator*
virtual const T & operator*() const
Definition: seqList.h:37
List::seqList::begin
virtual const_iterator begin() const
Definition: seqList.h:285
List::seqList::iterator::operator--
virtual iterator & operator--()
Definition: seqList.h:90
List::seqList::iterator::operator++
virtual iterator & operator++()
Definition: seqList.h:77
List
Definition: dLinkList.h:21
List::seqList::iterator::operator++
iterator operator++(int)
Definition: seqList.h:83
List::seqList::clear
virtual void clear()
Definition: seqList.h:298
List::seqList::iterator::operator--
iterator operator--(int)
Definition: seqList.h:96
List::seqList::iterator
Definition: seqList.h:72
List::seqList::iterator::operator*
virtual const T & operator*() const
Definition: seqList.h:76
List::seqList::iterator::iterator
iterator(T *p)
Definition: seqList.h:106
List::seqList
Definition: seqList.h:25
List::seqList::size
size_t size() const
返回线性表的当前元素个数,即长度
Definition: seqList.h:310
List::seqList::~seqList
virtual ~seqList()
Destroy the seq List object.
Definition: seqList.h:292
List::seqList::data
T * data
Definition: seqList.h:28
List::seqList::seqList
seqList(size_t initSize=10)
Construct a new seq List object.
Definition: seqList.h:332
List::seqList::pop_back
void pop_back()
删除表尾元素
Definition: seqList.h:455
List::seqList::const_iterator::operator!=
virtual bool operator!=(const const_iterator &rhs) const
Definition: seqList.h:62
List::seqList::const_iterator::operator--
const_iterator operator--(int)
Definition: seqList.h:54
List::seqList::resize
void resize(size_t n)
Change size Resizes the container so that it contains n elements.
Definition: seqList.h:485
List::seqList::begin
virtual iterator begin()
Definition: seqList.h:284
List::seqList::back
T & back()
Access last element.
Definition: seqList.h:473
List::seqList::operator[]
T & operator[](size_t index)
下标访问(mutator)
Definition: seqList.h:423
List::seqList::maxSize
size_t maxSize
Definition: seqList.h:30
List::seqList::const_iterator::operator==
virtual bool operator==(const const_iterator &rhs) const
Definition: seqList.h:61
List::seqList::iterator::operator*
virtual T & operator*()
Definition: seqList.h:75
List.h
栈的抽象类
List::seqList::const_iterator::operator--
virtual const_iterator & operator--()
Definition: seqList.h:49
List::seqList::push_back
void push_back(const T &x)
在表尾插入新元素
Definition: seqList.h:439
List::seqList::visit
virtual T visit(int i) const
Definition: seqList.h:316
List::seqList::const_iterator::current
T * current
Definition: seqList.h:65
List::seqList::const_iterator
Definition: seqList.h:33
List::seqList::insert
virtual void insert(int i, const T &obj)
Definition: seqList.h:389
List::operator+
seqList< T > operator+(const seqList< T > &A, const seqList< T > &B)
Definition: seqList.h:409
List::seqList::traverse
virtual void traverse(std::ostream &out=std::cout) const
Definition: seqList.h:322
List::seqList::length
virtual int length() const
Definition: seqList.h:304
List::seqList::end
virtual const_iterator end() const
Definition: seqList.h:287
List::seqList::search
virtual int search(const T &obj) const
Definition: seqList.h:368
List::seqList::const_iterator::operator++
virtual const_iterator & operator++()
Definition: seqList.h:38
List::seqList::const_iterator::const_iterator
const_iterator()
Definition: seqList.h:36