correction vector

This commit is contained in:
kinou-p 2022-11-20 03:00:39 +01:00
parent 7a299887cf
commit 435dac1965
11 changed files with 297 additions and 167 deletions

View File

@ -6,14 +6,14 @@
# By: apommier <apommier@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2022/10/12 19:45:18 by apommier #+# #+# #
# Updated: 2022/11/16 21:54:17 by apommier ### ########.fr #
# Updated: 2022/11/19 01:32:23 by apommier ### ########.fr #
# #
# **************************************************************************** #
NAME = a.out
SRCS = tests/main.cpp
INCLUDE = ./containers
OBJS = ${SRCS:.cpp=.o}
CC = c++
CFLAGS = -g -Wall -Wextra -Werror -std=c++98
@ -23,7 +23,7 @@ RM = rm -rf
$(CC) ${CFLAGS} -c $< -o $(<:.cpp=.o)
${NAME}: ${OBJS}
${CC} ${LIB} ${OBJS} -o ${NAME}
${CC} ${LIB} ${OBJS} ${INCLUDE} -o ${NAME}
all: ${NAME}

View File

@ -0,0 +1,24 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* enable_if.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/11/19 05:59:46 by apommier #+# #+# */
/* Updated: 2022/11/19 10:55:47 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#pragma once
namespace ft
{
template < bool B, class T = void >
struct enable_if {};
template < class T >
struct enable_if< true, T > {
typedef T type;
};
}

View File

@ -0,0 +1,31 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* is_integral.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/11/19 10:55:07 by apommier #+# #+# */
/* Updated: 2022/11/19 10:55:51 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#pragma once
namespace ft
{
template <class T> struct is_integral { static const bool value = false; };
template <> struct is_integral<bool> { static const bool value = true; };
template <> struct is_integral<char> { static const bool value = true; };
template <> struct is_integral<signed char> { static const bool value = true; };
template <> struct is_integral<unsigned char> { static const bool value = true; };
template <> struct is_integral<wchar_t> { static const bool value = true; };
template <> struct is_integral<short> { static const bool value = true; };
template <> struct is_integral<int> { static const bool value = true; };
template <> struct is_integral<long> { static const bool value = true; };
template <> struct is_integral<long long> { static const bool value = true; };
template <> struct is_integral<unsigned short> { static const bool value = true; };
template <> struct is_integral<unsigned int> { static const bool value = true; };
template <> struct is_integral<unsigned long> { static const bool value = true; };
template <> struct is_integral<unsigned long long> { static const bool value = true; };
}

View File

@ -1,28 +0,0 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* iterator.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/29 16:59:53 by apommier #+# #+# */
/* Updated: 2022/10/29 17:04:13 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef ITERATOR_HPP
# define ITERATOR_HPP
template <class Iterator> class iterator_traits;template <class T> class iterator_traits<T*>;template <class T> class iterator_traits<const T*>
template <class Category, class T, class Distance = ptrdiff_t, class Pointer = T*, class Reference = T&>
class iterator
{
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
typedef Category iterator_category;
};
#endif

View File

@ -0,0 +1,27 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* iterator_traits.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/11/19 05:07:29 by apommier #+# #+# */
/* Updated: 2022/11/19 05:09:05 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#pragma once
namespace ft
{
template<typename Iterator>
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef difference_type distance_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/30 16:14:35 by apommier #+# #+# */
/* Updated: 2022/11/16 19:21:41 by apommier ### ########.fr */
/* Updated: 2022/11/19 12:42:38 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -21,12 +21,12 @@ namespace ft
class random_access_iterator
{
public:
typedef T value_type;
typedef std::ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
private:
pointer _ptr;
@ -40,7 +40,7 @@ namespace ft
random_access_iterator(){ _ptr = NULL;}
random_access_iterator(pointer ptr){ _ptr = ptr;}
random_access_iterator(random_access_iterator const &cpy) {*this = cpy;}
~random_access_iterator(){}
random_access_iterator &operator=(random_access_iterator const &cpy)
@ -49,6 +49,10 @@ namespace ft
return (*this);
}
operator random_access_iterator<value_type const>() const
{
return (random_access_iterator<value_type const>(_ptr));
}
// random_access_iterator &operator=(pointer &ptr)
// {
// _ptr = ptr;
@ -70,20 +74,20 @@ namespace ft
//-------------INCREMENTERS--------------
//---------------------------------------
random_access_iterator &operator ++()
random_access_iterator &operator ++()
{
_ptr++;
return (*this);
}
random_access_iterator operator ++(int)
random_access_iterator operator ++(int)
{
random_access_iterator tmp(*this);
++(*this);
return (tmp);
}
random_access_iterator &operator --()
random_access_iterator &operator --()
{
_ptr--;
return (*this);
@ -99,10 +103,13 @@ namespace ft
//---------------------------------------
//----------------ADRESS-----------------
//---------------------------------------
value_type operator *() { return (*_ptr); }
reference operator *() { return (*_ptr); }
reference operator *() const { return (*_ptr); }
pointer operator ->() { return (_ptr); }
value_type operator [](difference_type nbr) { return (*(_ptr + nbr)); }
pointer operator ->() const { return (_ptr); }
// reference operator [](difference_type nbr) { return (*(_ptr + nbr)); } const
reference operator [](difference_type nbr) const { return (*(_ptr + nbr)); }
//---------------------------------------
//--------------OPERATION----------------
@ -111,7 +118,7 @@ namespace ft
// addition | soustraction
random_access_iterator operator +(difference_type const nbr) const { return (random_access_iterator(_ptr + nbr)); } // a + n
friend random_access_iterator operator +(int const lhs, random_access_iterator const& rhs) { return (rhs + lhs); } // n + a
random_access_iterator &operator -(difference_type nbr) { return random_access_iterator(_ptr - nbr); } // a - n
random_access_iterator operator -(difference_type nbr) { return random_access_iterator(_ptr - nbr); } // a - n
difference_type operator -(random_access_iterator const &rhs) const { return (_ptr - rhs._ptr) ; } // a - b
//friend difference_type &operator -(random_access_iterator const& lhs, random_access_iterator const& rhs) { return ((difference_type)(lhs._ptr - rhs._ptr)); } // a - b
//random_access_iterator operator -(const random_access_iterator &b) { return random_access_iterator(_ptr + b); } // a - b 2?

View File

@ -0,0 +1,83 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* reverse_iterator.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/11/19 05:14:31 by apommier #+# #+# */
/* Updated: 2022/11/19 05:49:52 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef REVERSE_ITERATOR_HPP
# define REVERSE_ITERATOR_HPP
# include <cstddef>
namespace ft
{
template<typename Iter>
class reverse_iterator
{
public:
typedef Iter iterator_type;
typedef typename ft::iterator_traits<Iter>::iterator_category iterator_category;
typedef typename ft::iterator_traits<Iter>::value_type value_type;
typedef typename ft::iterator_traits<Iter>::difference_type difference_type;
typedef typename ft::iterator_traits<Iter>::pointer pointer;
typedef typename ft::iterator_traits<Iter>::reference reference;
private:
Iter _Ite;
public:
//---------------------------------------
//--------CONSTRUCTOR DESTRUCTOR---------
//---------------------------------------
reverse_iterator(){}
reverse_iterator(pointer Ite){}
reverse_iterator(reverse_iterator const &cpy) {}
~reverse_iterator(){}
reverse_iterator &operator=(reverse_iterator const &cpy)
{
_Ite = cpy._Ite;
return (*this);
}
//---------------------------------------
//-------------COMPARAISON---------------
//---------------------------------------
//---------------------------------------
//-------------INCREMENTERS--------------
//---------------------------------------
//---------------------------------------
//----------------ADRESS-----------------
//---------------------------------------
reference operator *() { return (*_Ite); }
const reference operator *() const { return (*_Ite); }
pointer operator ->() { return (_Ite); }
const pointer operator ->() const { return (_Ite); }
reference operator [](difference_type nbr) const { return (*(_Ite + nbr)); }
//---------------------------------------
//--------------OPERATION----------------
//---------------------------------------
//---------------------------------
//--------------GET----------------
//---------------------------------
};
}

View File

@ -1,43 +0,0 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* vector_iterators.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/30 16:03:53 by apommier #+# #+# */
/* Updated: 2022/10/30 16:12:03 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef VECTOR_ITERATORS_HPP
# define VECTOR_ITERATORS_HPP
namespace ft
{
template <typename T>
class random_access_iterator
{
public :
random_access_iterator()
{
}
random_access_iterator(random_access_iterator cpy)
{
}
~random_access_iterator()
{
}
private :
};
}
#endif

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/12 19:46:25 by apommier #+# #+# */
/* Updated: 2022/11/17 07:41:22 by apommier ### ########.fr */
/* Updated: 2022/11/18 11:58:52 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -30,19 +30,19 @@ class map
//---------MEMBER TYPE---------
//-----------------------------
typedef Key key_type;
typedef T mapped_type;
typedef std::pair<const Key, T> value_type;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef Compare key_compare;
typedef Allocator allocator_type;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef Allocator::pointer pointer;
typedef Allocator::const_pointer const_pointer;
typedef LegacyBidirectionalIterator iterator;
typedef LegacyBidirectionalIterator const_iterator;
typedef Key key_type;
typedef T mapped_type;
typedef std::pair<const Key, T> value_type;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef Compare key_compare;
typedef Allocator allocator_type;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef Allocator::pointer pointer;
typedef Allocator::const_pointer const_pointer;
typedef LegacyBidirectionalIterator iterator;
typedef LegacyBidirectionalIterator const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
@ -51,27 +51,38 @@ class map
//-----------------------------
private :
pointer _start;
pointer _start;
pointer _end;
size_type _size;
size_type _capacity;
allocator_type _alloc;
public :
//---------------------------------------
//---------COPLIEN FORM FUNCTION---------
//---------------------------------------
map();
map()
{
_start = 0;
_end = 0;
_size = 0;
_capacity = 0;
_alloc = 0;
}
explicit map( const Compare& comp, const Allocator& alloc = Allocator() )
{
}
template< class InputIt >
map( InputIt first, InputIt last, const Compare& comp = Compare(), const Allocator& alloc = Allocator() )
{
}
map( const map& x)
{
@ -81,14 +92,12 @@ class map
{
}
map& operator=( const map& x )
{
}
//----------------------------------
//---------MEMBER FUNCTION----------
//----------------------------------
@ -218,7 +227,6 @@ class map
}
//-------------------------
//--------Observers--------
//-------------------------
@ -282,7 +290,6 @@ class map
}
};
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/12 19:46:32 by apommier #+# #+# */
/* Updated: 2022/11/17 06:53:12 by apommier ### ########.fr */
/* Updated: 2022/11/20 02:57:45 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,6 +14,8 @@
# define VECTOR_HPP
# include "./iterators/random_access_iterator.hpp"
# include "./iterators/enable_if.hpp"
# include "./iterators/is_integral.hpp"
# include <cstddef>
# include <memory>
@ -37,7 +39,7 @@ class vector
typedef T* pointer;
typedef const T* const_pointer;
typedef ft::random_access_iterator<value_type> iterator;
typedef const ft::random_access_iterator<value_type> const_iterator;
typedef ft::random_access_iterator<const value_type> const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::ptrdiff_t difference_type;
@ -49,7 +51,7 @@ class vector
//-----------------------------
private:
value_type *_tab;
pointer _tab;
size_type _size;
size_type _capacity;
@ -74,35 +76,32 @@ class vector
explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()): _alloc(alloc) //fill constructor
{
_tab = 0;
_size = 0;
_capacity = 0;
_alloc = alloc;
_tab = _alloc.allocate(n);
_size = n;
_capacity = n;
while (n--)
_alloc.construct(_tab + n, val);
}
vector (const vector& x)//copy constructor
{
*this = x;
}
~vector()
{
if (_tab && _capacity)
if (_capacity)
_alloc.deallocate(_tab, _capacity);
}
vector& operator= (const vector& x)//assignation operator
{
_tab = x._tab;
_alloc = x._alloc;
_size = x._size;
_capacity = x._capacity;
_alloc = x._alloc;
_capacity = x._size;
_tab = _alloc.allocate(_size);
for (size_type i = 0; i < _size; i++)
_alloc.construct(_tab + i, x._tab[i]);
return (*this);
}
@ -115,23 +114,43 @@ class vector
//-------------------------
iterator begin()
{
return (_tab);
return (iterator(_tab));
}
const_iterator begin() const
{
return const_iterator(_tab);
}
iterator end()
{
return (_tab + _size);
return iterator(_tab + _size);
}
const_iterator end() const
{
return const_iterator(_tab + _size);
}
reverse_iterator rbegin()
{
return (_tab + _size);
return iterator(_tab + _size);
}
const_reverse_iterator rbegin() const
{
return iterator(_tab + _size);
}
reverse_iterator rend()
{
return (_tab);
}
const_reverse_iterator rend() const
{
return (_tab);
}
//------------------------
//--------Capacity--------
@ -164,9 +183,10 @@ class vector
while (n > _size)
{
_alloc.construct(_tab + _size, val);
_size++;
//_end++;
}
_size = n;
//_size = n;
}
}
@ -214,13 +234,17 @@ class vector
reference at (size_type n)
{
//exception
return (_tab[n]);
if (n >= _size)
throw (std::out_of_range("ft::vector::at"));
return (*(_tab + n));
}
const_reference at (size_type n) const
{
//exception
return (_tab[n]);
if (n >= _size)
throw (std::out_of_range("ft::vector::at"));
return (*(_tab + n));
}
reference front()
@ -235,12 +259,12 @@ class vector
reference back()
{
return (*(_tab + _size));
return (*(_tab + _size - 1));
}
const_reference back() const
{
return (*(_tab + _size));
return (*(_tab + _size - 1));
}
value_type* data()
@ -256,8 +280,10 @@ class vector
//-------------------------
//--------Modifiers--------
//-------------------------
template <class InputIterator>
void assign (InputIterator first, InputIterator last) //range
//void assign (InputIterator first, InputIterator last) //range
void assign (InputIterator first, InputIterator last, typename ft::enable_if<!ft::is_integral<InputIterator>::value, InputIterator>::type* = 0)
{
this->clear();
while (first < last)
@ -277,12 +303,13 @@ class vector
_alloc.construct(_tab + n, val);
}
void push_back (const value_type& val)
void push_back (const_reference val)
{
if (!_capacity)
this->reserve(1);
else if (_size == _capacity)
this->reserve(_size);
this->reserve(_size * 2);
//std::cout << "coucou1\n";
_alloc.construct(_tab + _size, val);
_size++;
}
@ -299,6 +326,7 @@ class vector
iterator insert (iterator position, const value_type& val) //single element
{
this->insert(position, 1, val);
return (position);
}
void insert (iterator position, size_type n, const value_type& val) //fill
@ -335,11 +363,11 @@ class vector
if (_size + (last - first) > this->max_size())
throw (std::length_error("vector::resize"));
tmp = _alloc.allocate(_size + (last - first));
for (i = 0; i < position; i++)
for (i = 0; i < position - _tab; i++)
tmp[i] = _tab[i];
while (first + j != last)
{
tmp[i + j] = *(first + j);
tmp[i + j] = *(j + first);
j++;
}
while (_size - i)
@ -352,31 +380,42 @@ class vector
iterator erase (iterator position)
{
iterator ret = position;
_alloc.destroy(position);
while (_tab + _size - 1 > position + _tab)
_alloc.destroy(&(*position));
// while (_tab + _size - 1 > _tab + (position - _tab))
// {
// *position = *(position + 1);
// position++;
// _alloc.destroy(&(*position));
// }
for (size_type i = 0; _tab + _size - 1 > _tab + (position - _tab + i); i++)
{
*position = *(position + 1);
position++;
_alloc.destroy(position);
_alloc.construct(&(*(position + i)), *(position + i + 1));
_alloc.destroy(&(*(position + i + 1)));
}
_size--;
return (ret + 1);
return (position);
}
iterator erase (iterator first, iterator last)
{
difference_type lenght = last - first;
for (int i = 0; lenght - i; i++)
_alloc.destroy(first + i);
while (_tab + _size - 1 != _tab + lenght)
//std::cout << "diff = " << lenght << std::endl;
int i;
for (i = 0; lenght - i - 1; i++)
_alloc.destroy(&(*(first + i)));
for (i = 0; _size - i - 1; i++)
{
*first = *(first + lenght);
first++;
_alloc.destroy(first + lenght);
}
return (last + 1);
_alloc.construct(&(*(first + i)), *(first + lenght + i));
_alloc.destroy(&(*(first + lenght + i )));
}
// for (; _size - lenght - i; i++)
// {
// _alloc.construct(&(*(first + i)), *(first + lenght + i));
// _alloc.destroy(&(*(first + _size - lenght + i )));
// }
_size -= lenght;
return (first);
}
void swap (vector& x)

View File

@ -1,17 +0,0 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* stack_test.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/19 14:04:13 by apommier #+# #+# */
/* Updated: 2022/10/19 14:29:06 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
// void tester()
// {
// //ft::stack first()
// return;
// }