#include "iostream"
#define ll long long
using
namespace
std;
template
<
typename
DT>
class
GenericMyVector {
private
:
DT* arr;
ll capacity;
ll length;
public
:
explicit
GenericMyVector(ll = 100);
ll push_back(DT);
DT pop_back();
ll size()
const
;
DT& operator[](ll);
class
iterator {
private
:
DT* ptr;
public
:
explicit
iterator()
: ptr(nullptr)
{
}
explicit
iterator(DT* p)
: ptr(p)
{
}
bool
operator==(
const
iterator& rhs)
const
{
return
ptr == rhs.ptr;
}
bool
operator!=(
const
iterator& rhs)
const
{
return
!(*
this
== rhs);
}
DT operator*()
const
{
return
*ptr;
}
iterator& operator++()
{
++ptr;
return
*
this
;
}
iterator operator++(
int
)
{
iterator temp(*
this
);
++*
this
;
return
temp;
}
};
iterator begin()
const
;
iterator end()
const
;
};
template
<
typename
DT>
GenericMyVector<DT>::GenericMyVector(ll n)
: capacity(n), arr(
new
DT[n]), length(0)
{
}
template
<
typename
DT>
ll GenericMyVector<DT>::push_back(DT data)
{
if
(length == capacity) {
DT* old = arr;
arr =
new
DT[capacity = capacity * 2];
copy(old, old + length, arr);
delete
[] old;
}
arr[length++] = data;
return
length;
}
template
<
typename
DT>
DT GenericMyVector<DT>::pop_back()
{
return
arr[length-- - 1];
}
template
<
typename
DT>
ll GenericMyVector<DT>::size()
const
{
return
length;
}
template
<
typename
DT>
DT& GenericMyVector<DT>::operator[](ll index)
{
if
(index >= length) {
cout <<
"Error: Array index out of bound"
;
exit
(0);
}
return
*(arr + index);
}
template
<
typename
DT>
typename
GenericMyVector<DT>::iterator
GenericMyVector<DT>::begin()
const
{
return
iterator(arr);
}
template
<
typename
DT>
typename
GenericMyVector<DT>::iterator
GenericMyVector<DT>::end()
const
{
return
iterator(arr + length);
}
template
<
typename
V>
void
display_vector(V& v)
{
typename
V::iterator ptr;
for
(ptr = v.begin(); ptr != v.end(); ptr++) {
cout << *ptr <<
' '
;
}
cout <<
'\n'
;
}
int
main()
{
cout <<
"For Integer data_type"
<< endl;
GenericMyVector<
int
> v;
v.push_back(5);
v.push_back(6);
v.push_back(7);
v.push_back(8);
v.push_back(9);
v.push_back(10);
v.push_back(11);
v.push_back(12);
GenericMyVector<
int
>::iterator it;
cout <<
"Element in vector v : "
;
display_vector(v);
cout <<
"size: "
<< v.size() << endl;
cout <<
"v[2]: "
<< v[2] <<
'\n'
;
cout <<
"Popped Element: "
<< v.pop_back() <<
'\n'
;
display_vector(v);
cout << endl;
cout <<
"For Char data_type"
<< endl;
GenericMyVector<
char
> c;
c.push_back(
'a'
);
c.push_back(
'b'
);
c.push_back(
'c'
);
c.push_back(
'd'
);
c.push_back(
'e'
);
c.push_back(
'f'
);
c.push_back(
'g'
);
c.push_back(
'h'
);
GenericMyVector<
char
>::iterator it1;
cout <<
"Element in vector c : "
;
display_vector(c);
cout <<
"size: "
<< c.size() <<
'\n'
;
cout <<
"c[2]: "
<< c[2] <<
'\n'
;
cout <<
"pop: "
<< c.pop_back() <<
'\n'
;
cout <<
"Element in vector c : "
;
display_vector(c);
return
0;
}