vector insert ok
This commit is contained in:
@@ -119,9 +119,10 @@ public:
|
||||
void pop_back();
|
||||
// insert ------------------------------------
|
||||
iterator insert(iterator position, const value_type& val);
|
||||
// void insert(iterator position, size_type n, const value_type& val);
|
||||
// template <class InputIterator>
|
||||
// void insert(iterator position, InputIterator first, InputIterator last);
|
||||
void insert(iterator position, size_type n, const value_type& val);
|
||||
template <class InputIterator>
|
||||
typename enable_if< !is_integral<InputIterator>::value,void >::type
|
||||
insert(iterator position, InputIterator first, InputIterator last);
|
||||
// erase -------------------------------------
|
||||
iterator erase(iterator position);
|
||||
iterator erase(iterator first, iterator last);
|
||||
|
||||
@@ -259,9 +259,9 @@ VT_TPL typename VT::iterator VT::
|
||||
}
|
||||
it = end();
|
||||
if (position != it)
|
||||
{
|
||||
{
|
||||
_allocator.construct(it, *(it - 1));
|
||||
while (--it != position)
|
||||
while (it-- != position)
|
||||
*(it + 1) = *it;
|
||||
}
|
||||
_allocator.destroy(position);
|
||||
@@ -269,14 +269,87 @@ VT_TPL typename VT::iterator VT::
|
||||
_size++;
|
||||
return (position);
|
||||
}
|
||||
//VT_TPL void VT::
|
||||
// insert(iterator position, size_type n, const value_type& val) {
|
||||
//
|
||||
//}
|
||||
//VT_TPL template <class InputIterator> void VT::
|
||||
// insert(iterator position, InputIterator first, InputIterator last) {
|
||||
//
|
||||
//}
|
||||
VT_TPL void VT::
|
||||
insert(iterator position, size_type n, const value_type& val) {
|
||||
|
||||
difference_type distance;
|
||||
iterator it_end;
|
||||
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 -------------------------------------
|
||||
VT_TPL typename VT::iterator VT::
|
||||
erase(iterator position) {
|
||||
|
||||
207
tests/main.cpp
207
tests/main.cpp
@@ -11,11 +11,23 @@
|
||||
#include "vector.hpp"
|
||||
#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() {
|
||||
|
||||
/*
|
||||
TEST(vector::vector (constructor))
|
||||
{
|
||||
// title
|
||||
@@ -105,7 +117,6 @@ int main() {
|
||||
std::cout << '\n';
|
||||
}
|
||||
TESTEND
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
@@ -152,7 +163,6 @@ int main() {
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
TEST(vector::size)
|
||||
{
|
||||
// title
|
||||
@@ -623,95 +633,177 @@ int main() {
|
||||
std::cout << "capacity : " << myvector.capacity() << '\n';
|
||||
}
|
||||
TESTEND
|
||||
*/
|
||||
|
||||
|
||||
TEST(vector::insert)
|
||||
{
|
||||
// // title
|
||||
// TITLE(cplusplus.com reference :)
|
||||
//
|
||||
// std::vector<int> myvector (3,100);
|
||||
// std::vector<int>::iterator it;
|
||||
//
|
||||
// it = myvector.begin();
|
||||
// it = myvector.insert ( it , 200 );
|
||||
//
|
||||
// myvector.insert (it,2,300);
|
||||
//
|
||||
// // "it" no longer valid, get a new one:
|
||||
// it = myvector.begin();
|
||||
//
|
||||
// std::vector<int> anothervector (2,400);
|
||||
// myvector.insert (it+2,anothervector.begin(),anothervector.end());
|
||||
//
|
||||
// int myarray [] = { 501,502,503 };
|
||||
// myvector.insert (myvector.begin(), myarray, myarray+3);
|
||||
//
|
||||
// std::cout << "myvector contains:";
|
||||
// for (it=myvector.begin(); it<myvector.end(); it++)
|
||||
// std::cout << ' ' << *it;
|
||||
// std::cout << '\n';
|
||||
ft::vector<int>::iterator it;
|
||||
ft::vector<mystruct*>::iterator its;
|
||||
int i;
|
||||
|
||||
// title
|
||||
TITLE(cplusplus.com reference :)
|
||||
|
||||
ft::vector<int> myvector (3,100);
|
||||
|
||||
it = myvector.begin();
|
||||
it = myvector.insert ( it , 200 );
|
||||
myvector.insert (it,2,300);
|
||||
|
||||
ft::vector<int> anothervector (2,400);
|
||||
it = myvector.begin();
|
||||
myvector.insert (it+2,anothervector.begin(),anothervector.end());
|
||||
|
||||
int myarray [] = { 501,502,503 };
|
||||
myvector.insert (myvector.begin(), myarray, myarray+3);
|
||||
|
||||
std::cout << "myvector contains:";
|
||||
for (it=myvector.begin(); it<myvector.end(); it++)
|
||||
std::cout << ' ' << *it;
|
||||
std::cout << '\n';
|
||||
|
||||
|
||||
// title
|
||||
TITLE(tests positions on insert(pos, value) :)
|
||||
|
||||
ft::vector<int> myvector2 (3,100);
|
||||
ft::vector<int>::iterator it2;
|
||||
|
||||
it2 = myvector2.begin();
|
||||
std::cout << "\nsize:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n";
|
||||
myvector2.insert ( it2 , 200 );
|
||||
it = myvector2.begin();
|
||||
std::cout << "size:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n";
|
||||
myvector2.insert ( it , 200 );
|
||||
std::cout << "myvector contains:";
|
||||
for (it2 = myvector2.begin(); it2 < myvector2.end(); it2++)
|
||||
std::cout << ' ' << *it2;
|
||||
for (it = myvector2.begin(); it < myvector2.end(); it++)
|
||||
std::cout << ' ' << *it;
|
||||
std::cout << "\nsize:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n";
|
||||
|
||||
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";
|
||||
myvector3.insert ( it3 , 200 );
|
||||
myvector3.insert ( it , 200 );
|
||||
std::cout << "myvector contains:";
|
||||
for (it3 = myvector3.begin(); it3 < myvector3.end(); it3++)
|
||||
std::cout << ' ' << *it3;
|
||||
for (it = myvector3.begin(); it < myvector3.end(); it++)
|
||||
std::cout << ' ' << *it;
|
||||
std::cout << "\nsize:" << myvector3.size() << " capacity:" << myvector3.capacity() << "\n";
|
||||
|
||||
|
||||
// title
|
||||
TITLE(tests positions on insert(pos, value) with struct :)
|
||||
|
||||
mystruct s_1;
|
||||
mystruct s_2;
|
||||
ft::vector<mystruct*> myvector4;
|
||||
mystruct *s;
|
||||
|
||||
s_1.value = 1;
|
||||
s_2.value = 2;
|
||||
i = 0;
|
||||
while (i < 3)
|
||||
{
|
||||
s = new mystruct(i++);
|
||||
myvector4.push_back(s);
|
||||
}
|
||||
|
||||
ft::vector<mystruct> myvector4 (3,s_1);
|
||||
ft::vector<mystruct>::iterator it4;
|
||||
|
||||
it4 = myvector4.begin();
|
||||
std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
|
||||
myvector4.insert ( it4 , s_2 );
|
||||
its = myvector4.begin();
|
||||
std::cout << "size:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n";
|
||||
s = new mystruct(i++);
|
||||
myvector4.insert ( its , s );
|
||||
std::cout << "myvector contains:";
|
||||
for (it4 = myvector4.begin(); it4 < myvector4.end(); it4++)
|
||||
std::cout << ' ' << (*it4).value;
|
||||
for (its = myvector4.begin(); its < myvector4.end(); its++)
|
||||
std::cout << ' ' << **its;
|
||||
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";
|
||||
myvector4.insert ( it4 , s_2 );
|
||||
s = new mystruct(i++);
|
||||
myvector4.insert ( its , s );
|
||||
std::cout << "myvector contains:";
|
||||
for (it4 = myvector4.begin(); it4 < myvector4.end(); it4++)
|
||||
std::cout << ' ' << (*it4).value;
|
||||
for (its = myvector4.begin(); its < myvector4.end(); its++)
|
||||
std::cout << ' ' << **its;
|
||||
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
|
||||
|
||||
|
||||
/*
|
||||
TEST(vector::erase)
|
||||
{
|
||||
// title
|
||||
@@ -843,7 +935,6 @@ int main() {
|
||||
myvector.get_allocator().deallocate(p,5);
|
||||
}
|
||||
TESTEND
|
||||
*/
|
||||
|
||||
|
||||
// execute tests and print them :
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
# cd $(dirname $0)
|
||||
|
||||
make stl > /dev/null
|
||||
./containers > tests/output_stl.log
|
||||
echo -e "\nstl :"
|
||||
time ./containers > tests/output_stl.log
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user