vector insert ok

This commit is contained in:
hugogogo
2022-06-10 16:47:56 +02:00
parent 68ada8ca68
commit c187d34ce7
4 changed files with 240 additions and 73 deletions

View File

@@ -119,9 +119,10 @@ public:
void pop_back(); void pop_back();
// insert ------------------------------------ // insert ------------------------------------
iterator insert(iterator position, const value_type& val); iterator insert(iterator position, const value_type& val);
// void insert(iterator position, size_type n, const value_type& val); void insert(iterator position, size_type n, const value_type& val);
// template <class InputIterator> template <class InputIterator>
// void insert(iterator position, InputIterator first, InputIterator last); typename enable_if< !is_integral<InputIterator>::value,void >::type
insert(iterator position, InputIterator first, InputIterator last);
// erase ------------------------------------- // erase -------------------------------------
iterator erase(iterator position); iterator erase(iterator position);
iterator erase(iterator first, iterator last); iterator erase(iterator first, iterator last);

View File

@@ -261,7 +261,7 @@ VT_TPL typename VT::iterator VT::
if (position != it) if (position != it)
{ {
_allocator.construct(it, *(it - 1)); _allocator.construct(it, *(it - 1));
while (--it != position) while (it-- != position)
*(it + 1) = *it; *(it + 1) = *it;
} }
_allocator.destroy(position); _allocator.destroy(position);
@@ -269,14 +269,87 @@ VT_TPL typename VT::iterator VT::
_size++; _size++;
return (position); return (position);
} }
//VT_TPL void VT:: VT_TPL void VT::
// insert(iterator position, size_type n, const value_type& val) { insert(iterator position, size_type n, const value_type& val) {
//
//} difference_type distance;
//VT_TPL template <class InputIterator> void VT:: iterator it_end;
// insert(iterator position, InputIterator first, InputIterator last) { iterator it;
//
//} if (_size + n > _capacity)
{
distance = position - begin();
_increment_capacity(n);
position = begin() + distance;
}
it_end = end();
if (position != it_end)
{
it = it_end;
while (it + n != it_end && it != position)
{
it--;
_allocator.construct(it + n, *it);
}
while (it != position)
{
it--;
*(it + n) = *it;
}
_destroy(position, std::min(position + n, it_end));
}
for (size_type i = 0; i < n; i++, position++)
_allocator.construct(position, val);
_size += n;
}
VT_TPL template <class InputIterator>
typename enable_if< !is_integral<InputIterator>::value,void >::type VT::
insert(iterator position, InputIterator first, InputIterator last) {
difference_type dist;
difference_type n;
iterator it_end;
iterator it;
n = std::distance(first, last);
if (_size + n > _capacity)
{
dist = position - begin();
_increment_capacity(n);
position = begin() + dist;
}
it_end = end();
if (position != it_end)
{
it = it_end;
while (it + n != it_end && it != position)
{
it--;
_allocator.construct(it + n, *it);
}
while (it != position)
{
it--;
*(it + n) = *it;
}
_destroy(position, std::min(position + n, it_end));
}
// for (size_type i = 0; i < n; i++, position++)
// _allocator.construct(position, val);
while (first != last)
{
_allocator.construct(position, *first);
++position;
++first;
}
_size += n;
}
// erase ------------------------------------- // erase -------------------------------------
VT_TPL typename VT::iterator VT:: VT_TPL typename VT::iterator VT::
erase(iterator position) { erase(iterator position) {

View File

@@ -11,11 +11,23 @@
#include "vector.hpp" #include "vector.hpp"
#endif #endif
struct mystruct { int value; }; /**/ // struct for tests
/**/
/**/ struct mystruct {
/**/ public:
/**/ mystruct(int data = 1) {_val = new int[1]; _val[0] = data;}
/**/ ~mystruct() {delete[] _val;}
/**/ int * get_data() const {return _val;}
/**/ private:
/**/ int * _val;
/**/ };
/**/ std::ostream & operator<<(std::ostream & o, mystruct const & rhs) {
/**/ o << rhs.get_data()[0];
/**/ return (o);
/**/ }
int main() { int main() {
/*
TEST(vector::vector (constructor)) TEST(vector::vector (constructor))
{ {
// title // title
@@ -105,7 +117,6 @@ int main() {
std::cout << '\n'; std::cout << '\n';
} }
TESTEND TESTEND
*/
/* /*
@@ -152,7 +163,6 @@ int main() {
*/ */
/*
TEST(vector::size) TEST(vector::size)
{ {
// title // title
@@ -623,95 +633,177 @@ int main() {
std::cout << "capacity : " << myvector.capacity() << '\n'; std::cout << "capacity : " << myvector.capacity() << '\n';
} }
TESTEND TESTEND
*/
TEST(vector::insert) TEST(vector::insert)
{ {
// // title ft::vector<int>::iterator it;
// TITLE(cplusplus.com reference :) ft::vector<mystruct*>::iterator its;
// int i;
// std::vector<int> myvector (3,100);
// std::vector<int>::iterator it; // title
// TITLE(cplusplus.com reference :)
// it = myvector.begin();
// it = myvector.insert ( it , 200 ); ft::vector<int> myvector (3,100);
//
// myvector.insert (it,2,300); it = myvector.begin();
// it = myvector.insert ( it , 200 );
// // "it" no longer valid, get a new one: myvector.insert (it,2,300);
// it = myvector.begin();
// ft::vector<int> anothervector (2,400);
// std::vector<int> anothervector (2,400); it = myvector.begin();
// myvector.insert (it+2,anothervector.begin(),anothervector.end()); myvector.insert (it+2,anothervector.begin(),anothervector.end());
//
// int myarray [] = { 501,502,503 }; int myarray [] = { 501,502,503 };
// myvector.insert (myvector.begin(), myarray, myarray+3); myvector.insert (myvector.begin(), myarray, myarray+3);
//
// std::cout << "myvector contains:"; std::cout << "myvector contains:";
// for (it=myvector.begin(); it<myvector.end(); it++) for (it=myvector.begin(); it<myvector.end(); it++)
// std::cout << ' ' << *it; std::cout << ' ' << *it;
// std::cout << '\n'; std::cout << '\n';
// title // title
TITLE(tests positions on insert(pos, value) :) TITLE(tests positions on insert(pos, value) :)
ft::vector<int> myvector2 (3,100); ft::vector<int> myvector2 (3,100);
ft::vector<int>::iterator it2;
it2 = myvector2.begin(); it = myvector2.begin();
std::cout << "\nsize:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n"; std::cout << "size:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n";
myvector2.insert ( it2 , 200 ); myvector2.insert ( it , 200 );
std::cout << "myvector contains:"; std::cout << "myvector contains:";
for (it2 = myvector2.begin(); it2 < myvector2.end(); it2++) for (it = myvector2.begin(); it < myvector2.end(); it++)
std::cout << ' ' << *it2; std::cout << ' ' << *it;
std::cout << "\nsize:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n"; std::cout << "\nsize:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n";
ft::vector<int> myvector3 (3,100); ft::vector<int> myvector3 (3,100);
ft::vector<int>::iterator it3;
it3 = myvector3.end(); it = myvector3.end();
std::cout << "\nsize:" << myvector3.size() << " capacity:" << myvector3.capacity() << "\n"; std::cout << "\nsize:" << myvector3.size() << " capacity:" << myvector3.capacity() << "\n";
myvector3.insert ( it3 , 200 ); myvector3.insert ( it , 200 );
std::cout << "myvector contains:"; std::cout << "myvector contains:";
for (it3 = myvector3.begin(); it3 < myvector3.end(); it3++) for (it = myvector3.begin(); it < myvector3.end(); it++)
std::cout << ' ' << *it3; std::cout << ' ' << *it;
std::cout << "\nsize:" << myvector3.size() << " capacity:" << myvector3.capacity() << "\n"; std::cout << "\nsize:" << myvector3.size() << " capacity:" << myvector3.capacity() << "\n";
// title // title
TITLE(tests positions on insert(pos, value) with struct :) TITLE(tests positions on insert(pos, value) with struct :)
mystruct s_1; ft::vector<mystruct*> myvector4;
mystruct s_2; mystruct *s;
s_1.value = 1; i = 0;
s_2.value = 2; while (i < 3)
{
s = new mystruct(i++);
myvector4.push_back(s);
}
ft::vector<mystruct> myvector4 (3,s_1); its = myvector4.begin();
ft::vector<mystruct>::iterator it4; std::cout << "size:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
s = new mystruct(i++);
it4 = myvector4.begin(); myvector4.insert ( its , s );
std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
myvector4.insert ( it4 , s_2 );
std::cout << "myvector contains:"; std::cout << "myvector contains:";
for (it4 = myvector4.begin(); it4 < myvector4.end(); it4++) for (its = myvector4.begin(); its < myvector4.end(); its++)
std::cout << ' ' << (*it4).value; std::cout << ' ' << **its;
std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
it4 = myvector4.begin() + 2; its = myvector4.begin() + 2;
std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
myvector4.insert ( it4 , s_2 ); s = new mystruct(i++);
myvector4.insert ( its , s );
std::cout << "myvector contains:"; std::cout << "myvector contains:";
for (it4 = myvector4.begin(); it4 < myvector4.end(); it4++) for (its = myvector4.begin(); its < myvector4.end(); its++)
std::cout << ' ' << (*it4).value; std::cout << ' ' << **its;
std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
its = myvector4.end();
std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
s = new mystruct(i++);
myvector4.insert ( its , s );
std::cout << "myvector contains:";
for (its = myvector4.begin(); its < myvector4.end(); its++)
std::cout << ' ' << **its;
std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
// title
TITLE(tests insert(pos, size, value) :)
ft::vector<int> myvector5;
for (i = 1; i <= 5; i++)
myvector5.push_back(i * 100);
it = myvector5.begin() + 1;
myvector5.insert ( it , 150 );
it = myvector5.end();
myvector5.insert (it,2,600);
it = myvector5.end() - 2;
myvector5.insert (it,2,550);
std::cout << "myvector contains:";
for (it = myvector5.begin(); it < myvector5.end(); it++)
std::cout << ' ' << *it;
std::cout << '\n';
std::cout << "\nsize:" << myvector5.size() << " capacity:" << myvector5.capacity() << "\n";
// title
TITLE(tests positions on insert(pos, value) with struct :)
ft::vector<mystruct*> myvector6;
i = 1;
while (i <= 5)
{
s = new mystruct(i++ * 100);
myvector6.push_back(s);
}
its = myvector6.begin() + 1;
s = new mystruct(150);
myvector6.insert ( its , s );
its = myvector6.end();
s = new mystruct(600);
myvector6.insert ( its, 2, s );
its = myvector6.end() - 2;
s = new mystruct(550);
myvector6.insert ( its, 2, s );
std::cout << "myvector contains:";
for (its = myvector6.begin(); its < myvector6.end(); its++)
std::cout << ' ' << **its;
std::cout << "\nsize:" << myvector6.size() << " capacity:" << myvector6.capacity() << "\n";
// title
TITLE(tests insert(pos, first, last) with struct :)
ft::vector<mystruct*> myvector7;
for (i = 0; i < 5; i++)
{
s = new mystruct(42);
myvector7.push_back(s);
}
its = myvector7.begin() + 2;
myvector7.insert ( its, myvector6.begin() + 3, myvector6.end() - 2 );
std::cout << "myvector contains:";
for (its = myvector7.begin(); its < myvector7.end(); its++)
std::cout << ' ' << **its;
std::cout << "\nsize:" << myvector7.size() << " capacity:" << myvector7.capacity() << "\n";
} }
TESTEND TESTEND
/*
TEST(vector::erase) TEST(vector::erase)
{ {
// title // title
@@ -843,7 +935,6 @@ int main() {
myvector.get_allocator().deallocate(p,5); myvector.get_allocator().deallocate(p,5);
} }
TESTEND TESTEND
*/
// execute tests and print them : // execute tests and print them :

View File

@@ -2,9 +2,11 @@
# cd $(dirname $0) # cd $(dirname $0)
make stl > /dev/null make stl > /dev/null
./containers > tests/output_stl.log echo -e "\nstl :"
time ./containers > tests/output_stl.log
make ft > /dev/null make ft > /dev/null
./containers > tests/output_ft.log echo -e "\nft :"
time ./containers > tests/output_ft.log
diff --context=0 --color=always tests/output_stl.log tests/output_ft.log diff --context=0 --color=always tests/output_stl.log tests/output_ft.log