vector insert ok
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -259,9 +259,9 @@ VT_TPL typename VT::iterator VT::
|
|||||||
}
|
}
|
||||||
it = end();
|
it = end();
|
||||||
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) {
|
||||||
|
|||||||
207
tests/main.cpp
207
tests/main.cpp
@@ -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 :
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user