Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.64 KB | None | 0 0
  1. Given below is the modified code for the question.
  2. Please don't forget to rate the answer if it was helpful. Thank you
  3.  
  4.  
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. template <class T> class OrderedIterator; //forward declaration
  9.  
  10. template <class T>
  11. class OrderedSet {
  12. // =================
  13. friend class OrderedIterator<T>;
  14. int capacity; //maximum size of the container
  15. int size; //number of actual elements in the container
  16. T **buffer; //pointer to memory for holding elements
  17.  
  18. public:
  19. OrderedSet(int aCapacity = 100);
  20. OrderedSet(const OrderedSet<T> & c);
  21. ~OrderedSet();
  22.  
  23. typedef OrderedIterator<T> iterator;
  24.  
  25. int getSize() const {return size;} //answer number of elements
  26. bool isFull()const {return size == capacity;} //answer if full
  27.  
  28. OrderedSet<T> & addLast( T & element); //add to end
  29. OrderedSet<T> & addFirst( T & element); //add to front
  30. T & removeLast();//remove last element
  31. T & removeFirst(); //remove first element
  32. OrderedSet<T> & remove(const T & element); //remove all items == element
  33. iterator begin(void); //provide an start iterator
  34. iterator end(void); //provide an end iterator
  35. bool contains(const T &element); //checks if given element is present in set
  36. void expand(); //doubles the capacity
  37.  
  38. void print(){
  39. cout << "Set\n";
  40. cout << "==========\n";
  41. for(int i=0; i<size; i++) cout << *buffer[i];
  42. }
  43.  
  44. };
  45.  
  46. template <class T>
  47. class OrderedIterator { //The iterator class
  48. // ===============
  49. int index; //location in the container being iterated
  50. OrderedSet<T> & s; //container being iterated
  51.  
  52. public:
  53. OrderedIterator(OrderedSet<T> & set, int position = 0);
  54. OrderedIterator<T> & operator++(int); //to advance to next element
  55. T & operator*(); //to get element
  56. bool operator==(const OrderedIterator<T> & iter);
  57. bool operator!=(const OrderedIterator<T> & iter);
  58. };
  59.  
  60.  
  61. //Constructor Implementations
  62. template <class T>
  63. OrderedSet<T>::OrderedSet(int aCapacity)
  64. : capacity(aCapacity),size(0), buffer(new T*[aCapacity]) {}
  65.  
  66. template <class T>
  67. OrderedSet<T>::OrderedSet(const OrderedSet<T> & c)
  68. : capacity(c.capacity), size(c.size), buffer(new T*[c.capacity]) {
  69. for(int i=0; i< capacity; i++) buffer[i] = c.buffer[i];
  70. }
  71.  
  72. template <class T>
  73. OrderedSet<T>::~OrderedSet() {delete [] buffer; }
  74. //Method Implementations
  75.  
  76. template <class T>
  77. OrderedSet<T> & OrderedSet<T>::addLast(T & element){
  78. if(!contains(element))
  79. {
  80. if(isFull())
  81. expand();
  82.  
  83. buffer[size++] = &element;
  84. }
  85. return *this;
  86. }
  87.  
  88. template <class T>
  89. OrderedSet<T> & OrderedSet<T>::addFirst(T & element){
  90.  
  91. if(!contains(element))
  92. {
  93. if(isFull())
  94. expand();
  95. size++;
  96. for(int i=size-1; i>0; i--) buffer[i] = buffer[i-1];
  97. buffer[0] = &element;
  98. }
  99.  
  100. return *this;
  101. }
  102.  
  103. template <class T>
  104. T & OrderedSet<T>::removeLast(){
  105. return * buffer[size--];
  106. }
  107.  
  108. template <class T>
  109. T & OrderedSet<T>::removeFirst(){
  110. T* temp;
  111. size--;
  112. temp = buffer[0];
  113. for(int i=0; i<size; i++) buffer[i] = buffer[i+1];
  114. return *temp;
  115. }
  116.  
  117. template <class T>
  118. OrderedSet<T> & OrderedSet<T>::remove(const T & item){
  119.  
  120. //remove all elements which are == item (assume T implements == oper)
  121. int newIndex = 0;
  122. for(int i=0; i<size; i++){
  123. if(*buffer[i] != item) buffer[newIndex++] = buffer[i];
  124. }
  125. size = newIndex;
  126. return *this;
  127. }
  128.  
  129. template <class T>
  130. bool OrderedSet<T>::contains(const T &element)
  131. {
  132. for(int i=0; i<size; i++)
  133. {
  134. if(*buffer[i] == element)
  135. return true;
  136. }
  137. return false;
  138. }
  139.  
  140.  
  141. template <class T>
  142. void OrderedSet<T>::expand()
  143. {
  144. capacity *= 2;
  145. T** temp = new T*[capacity];
  146. for(int i = 0; i < size; i++)
  147. temp[i] = buffer[i];
  148. delete buffer;
  149. buffer = temp;
  150. }
  151. template <class T>
  152. typename OrderedSet<T>::iterator OrderedSet<T>::begin(void) { //provide an start iterator
  153. return OrderedIterator<T>(*this);
  154. }
  155.  
  156. template <class T>
  157. typename OrderedSet<T>::iterator OrderedSet<T>::end(void) { //provide an end iterator
  158. return OrderedIterator<T>(*this, size);
  159. }
  160.  
  161. template <class T>
  162. OrderedIterator<T>::OrderedIterator(OrderedSet<T> & set, int position)
  163. : index(position), s(set) {}
  164.  
  165. template <class T>
  166. OrderedIterator<T> & OrderedIterator<T>::operator++(int) {
  167. index++; return *this;
  168. }
  169.  
  170. template <class T>
  171. T & OrderedIterator<T>::operator*() {
  172. return *(s.buffer[index]);
  173.  
  174. }
  175.  
  176. template <class T>
  177. bool OrderedIterator<T>::operator==(const OrderedIterator<T> & iter) {
  178. return (&s == &(iter.s)) && (index == iter.index);
  179. }
  180.  
  181. template <class T>
  182. bool OrderedIterator<T>::operator!=(const OrderedIterator<T> & iter) {
  183. return !(*this == iter);
  184. }
  185.  
  186.  
  187. class BankAccount{
  188. double balance;
  189. string owner;
  190. public:
  191. BankAccount(string anOwner, double anAmount):owner(anOwner), balance(anAmount) {}
  192. bool operator== (const BankAccount & b) {return owner == b.owner && balance == b.balance;}
  193. bool operator!= (const BankAccount & b) {return !(*this == b);}
  194. void printOn(ostream & o) const { o << owner << ": $" << balance << "\n"; }
  195. };
  196. ostream & operator<<(ostream & o, const BankAccount & b){
  197. b.printOn(o);
  198. return o;
  199. }
  200.  
  201. //Example of how the collection and iterator could be used
  202. int main() {
  203. BankAccount b1("John", 100.0), b2("Bill", 50.0), b3("Robert", 200.0), b4("Alice",150.0);
  204. OrderedSet<BankAccount> accounts(3); //initial capacity of 3, will expand when more added
  205. accounts.addLast(b1).addLast(b2).addLast(b3).addLast(b4).addLast(b2); //b2 is duplicate and will not be added
  206.  
  207. for(OrderedSet<BankAccount>::iterator itr = accounts.begin();
  208. itr != accounts.end(); itr++)
  209.  
  210. cout << *itr;
  211. accounts.print();
  212. accounts.remove(b2);
  213. accounts.print();
  214. return 0;
  215. }//end main
  216.  
  217.  
  218. output
  219. ======
  220. John: $100
  221. Bill: $50
  222. Robert: $200
  223. Alice: $150
  224. Collection
  225. ==========
  226. John: $100
  227. Bill: $50
  228. Robert: $200
  229. Alice: $150
  230. Collection
  231. ==========
  232. John: $100
  233. Robert: $200
  234. Alice: $150
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement