wip balance identical for erase and insert now
This commit is contained in:
4
Makefile
4
Makefile
@@ -39,8 +39,8 @@ EXT = cpp
|
|||||||
|
|
||||||
CFLAGS = -Wall -Wextra -Werror $(INCLUDES)
|
CFLAGS = -Wall -Wextra -Werror $(INCLUDES)
|
||||||
CFLAGS += -MMD -MP #see end-page note on header dependencie
|
CFLAGS += -MMD -MP #see end-page note on header dependencie
|
||||||
#CFLAGS += -std=c++98
|
CFLAGS += -std=c++98
|
||||||
#CFLAGS += -g3
|
CFLAGS += -g3
|
||||||
|
|
||||||
CFLAGS_STL = $(CFLAGS)
|
CFLAGS_STL = $(CFLAGS)
|
||||||
CFLAGS_STL += -D STL
|
CFLAGS_STL += -D STL
|
||||||
|
|||||||
@@ -175,9 +175,10 @@ private:
|
|||||||
|
|
||||||
// BBST
|
// BBST
|
||||||
enum {INSERT, ERASE};
|
enum {INSERT, ERASE};
|
||||||
void _balance(node<value_type>* n, bool action);
|
void _balance(node<value_type>* n);
|
||||||
short _compute_height(node<value_type>* n);
|
short _compute_height(node<value_type>* n);
|
||||||
short _balance_factor(node<value_type>* n);
|
short _balance_factor(node<value_type>* n);
|
||||||
|
short _balance_f(node<value_type>* n);
|
||||||
node<value_type>* _rotate_left(node<value_type>* n);
|
node<value_type>* _rotate_left(node<value_type>* n);
|
||||||
node<value_type>* _rotate_right(node<value_type>* n);
|
node<value_type>* _rotate_right(node<value_type>* n);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ MP_TPL pair<typename MP::iterator, bool> MP::
|
|||||||
next->up = n;
|
next->up = n;
|
||||||
_size++;
|
_size++;
|
||||||
|
|
||||||
_balance(n, INSERT);
|
_balance(n);
|
||||||
return (ft::make_pair(iterator(next, _sentinel), true));
|
return (ft::make_pair(iterator(next, _sentinel), true));
|
||||||
}
|
}
|
||||||
MP_TPL typename MP::iterator MP::
|
MP_TPL typename MP::iterator MP::
|
||||||
@@ -238,7 +238,7 @@ MP_TPL void MP::
|
|||||||
_allocator_node.deallocate(n, 1);
|
_allocator_node.deallocate(n, 1);
|
||||||
_size--;
|
_size--;
|
||||||
|
|
||||||
_balance(replace, ERASE);
|
_balance(replace);
|
||||||
}
|
}
|
||||||
MP_TPL void MP::
|
MP_TPL void MP::
|
||||||
erase(iterator first, iterator last) {
|
erase(iterator first, iterator last) {
|
||||||
@@ -417,7 +417,7 @@ MP_TPL typename MP::allocator_type MP::
|
|||||||
* private functions :
|
* private functions :
|
||||||
*********************/
|
*********************/
|
||||||
MP_TPL void MP::
|
MP_TPL void MP::
|
||||||
_balance(node<value_type>* n, bool action) {
|
_balance(node<value_type>* n) {
|
||||||
|
|
||||||
node<value_type>* old_n;
|
node<value_type>* old_n;
|
||||||
node<value_type>* parent = NULL;
|
node<value_type>* parent = NULL;
|
||||||
@@ -425,20 +425,25 @@ MP_TPL void MP::
|
|||||||
while (n)
|
while (n)
|
||||||
{
|
{
|
||||||
n->height = _compute_height(n);
|
n->height = _compute_height(n);
|
||||||
|
// n->height = _balance_f(n);
|
||||||
|
|
||||||
if (_balance_factor(n) > 1) // Left Heavy
|
if (_balance_factor(n) > 1) // Left Heavy
|
||||||
|
// if (n->height > 1) // Left Heavy
|
||||||
{
|
{
|
||||||
parent = n->up;
|
parent = n->up;
|
||||||
if (_balance_factor(n->left) < 0) // Left-Right Case (BF == -1)
|
if (_balance_factor(n->left) < 0) // Left-Right Case (BF == -1)
|
||||||
|
// if (n->left->height < 0) // Left-Right Case (BF == -1)
|
||||||
n->left = _rotate_left(n->left);
|
n->left = _rotate_left(n->left);
|
||||||
// Left-Left Case
|
// Left-Left Case
|
||||||
n = _rotate_right(n);
|
n = _rotate_right(n);
|
||||||
old_n = n->right;
|
old_n = n->right;
|
||||||
}
|
}
|
||||||
else if (_balance_factor(n) < -1) // Right Heavy
|
// else if (_balance_factor(n) < -1) // Right Heavy
|
||||||
|
else if (n->height < -1) // Right Heavy
|
||||||
{
|
{
|
||||||
parent = n->up;
|
parent = n->up;
|
||||||
if (_balance_factor(n->right) > 0) // Right-Left Case (BF == 1)
|
if (_balance_factor(n->right) > 0) // Right-Left Case (BF == 1)
|
||||||
|
// if (n->right->height > 0) // Right-Left Case (BF == 1)
|
||||||
n->right = _rotate_right(n->right);
|
n->right = _rotate_right(n->right);
|
||||||
// Right-Right Case
|
// Right-Right Case
|
||||||
n = _rotate_left(n);
|
n = _rotate_left(n);
|
||||||
@@ -451,23 +456,11 @@ MP_TPL void MP::
|
|||||||
parent->left = n;
|
parent->left = n;
|
||||||
else
|
else
|
||||||
parent->right = n;
|
parent->right = n;
|
||||||
if (action == INSERT)
|
parent = NULL;
|
||||||
break;
|
|
||||||
else if (action == ERASE)
|
|
||||||
parent = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
n = n->up;
|
n = n->up;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action == INSERT)
|
|
||||||
{
|
|
||||||
while (n)
|
|
||||||
{
|
|
||||||
n->height = _compute_height(n);
|
|
||||||
n = n->up;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
MP_TPL short MP::
|
MP_TPL short MP::
|
||||||
_compute_height(node<value_type>* n) {
|
_compute_height(node<value_type>* n) {
|
||||||
@@ -481,6 +474,18 @@ MP_TPL short MP::
|
|||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
MP_TPL short MP::
|
||||||
|
_balance_f(node<value_type>* n) {
|
||||||
|
|
||||||
|
if (n->left && n->right)
|
||||||
|
return n->left->height - n->right->height;
|
||||||
|
else if (n->left)
|
||||||
|
return (n->left->height + 1);
|
||||||
|
else if (n->right)
|
||||||
|
return (-1 - (n->right->height));
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
MP_TPL short MP::
|
MP_TPL short MP::
|
||||||
_balance_factor(node<value_type>* n) {
|
_balance_factor(node<value_type>* n) {
|
||||||
|
|
||||||
@@ -508,6 +513,8 @@ MP_TPL node<typename MP::value_type>* MP::
|
|||||||
|
|
||||||
n->height = _compute_height(n);
|
n->height = _compute_height(n);
|
||||||
ori_right->height = _compute_height(ori_right);
|
ori_right->height = _compute_height(ori_right);
|
||||||
|
// n->height = _balance_f(n);
|
||||||
|
// ori_right->height = _balance_f(ori_right);
|
||||||
|
|
||||||
if (n == _root)
|
if (n == _root)
|
||||||
{
|
{
|
||||||
@@ -532,6 +539,8 @@ MP_TPL node<typename MP::value_type>* MP::
|
|||||||
|
|
||||||
n->height = _compute_height(n);
|
n->height = _compute_height(n);
|
||||||
ori_left->height = _compute_height(ori_left);
|
ori_left->height = _compute_height(ori_left);
|
||||||
|
// n->height = _balance_f(n);
|
||||||
|
// ori_left->height = _balance_f(ori_left);
|
||||||
|
|
||||||
if (n == _root)
|
if (n == _root)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,35 +4,35 @@
|
|||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
// VECTOR
|
// VECTOR
|
||||||
tests_vector_constructor();
|
// tests_vector_constructor();
|
||||||
tests_vector_operator_assignation();
|
// tests_vector_operator_assignation();
|
||||||
tests_vector_begin();
|
// tests_vector_begin();
|
||||||
tests_vector_end();
|
// tests_vector_end();
|
||||||
tests_vector_rbegin();
|
// tests_vector_rbegin();
|
||||||
tests_vector_rend();
|
// tests_vector_rend();
|
||||||
tests_vector_size();
|
// tests_vector_size();
|
||||||
tests_vector_max_size();
|
// tests_vector_max_size();
|
||||||
tests_vector_resize();
|
// tests_vector_resize();
|
||||||
tests_vector_capacity();
|
// tests_vector_capacity();
|
||||||
tests_vector_empty();
|
// tests_vector_empty();
|
||||||
tests_vector_reserve();
|
// tests_vector_reserve();
|
||||||
tests_vector_operator_access();
|
// tests_vector_operator_access();
|
||||||
tests_vector_at();
|
// tests_vector_at();
|
||||||
tests_vector_front();
|
// tests_vector_front();
|
||||||
tests_vector_back();
|
// tests_vector_back();
|
||||||
tests_vector_assign();
|
// tests_vector_assign();
|
||||||
tests_vector_push_back();
|
// tests_vector_push_back();
|
||||||
tests_vector_pop_back();
|
// tests_vector_pop_back();
|
||||||
tests_vector_insert();
|
// tests_vector_insert();
|
||||||
tests_vector_erase();
|
// tests_vector_erase();
|
||||||
tests_vector_swap();
|
// tests_vector_swap();
|
||||||
tests_vector_clear();
|
// tests_vector_clear();
|
||||||
tests_vector_get_allocator();
|
// tests_vector_get_allocator();
|
||||||
tests_vector_swap_non_member();
|
// tests_vector_swap_non_member();
|
||||||
tests_vector_reverse_iterators();
|
// tests_vector_reverse_iterators();
|
||||||
tests_vector_relational_operators();
|
// tests_vector_relational_operators();
|
||||||
|
//
|
||||||
// MAP
|
// // MAP
|
||||||
tests_map_simple();
|
tests_map_simple();
|
||||||
tests_map_constructor();
|
tests_map_constructor();
|
||||||
tests_map_operator_assignation();
|
tests_map_operator_assignation();
|
||||||
@@ -58,14 +58,14 @@ int main() {
|
|||||||
tests_map_get_allocator();
|
tests_map_get_allocator();
|
||||||
tests_map_swap_non_member();
|
tests_map_swap_non_member();
|
||||||
tests_map_relational_operators();
|
tests_map_relational_operators();
|
||||||
|
//
|
||||||
// STACK
|
// // STACK
|
||||||
tests_stack_constructor();
|
// tests_stack_constructor();
|
||||||
tests_stack_empty();
|
// tests_stack_empty();
|
||||||
tests_stack_size();
|
// tests_stack_size();
|
||||||
tests_stack_top();
|
// tests_stack_top();
|
||||||
tests_stack_push();
|
// tests_stack_push();
|
||||||
tests_stack_pop();
|
// tests_stack_pop();
|
||||||
|
|
||||||
// execute tests and print them :
|
// execute tests and print them :
|
||||||
int size = test_list.size();
|
int size = test_list.size();
|
||||||
|
|||||||
Reference in New Issue
Block a user