void InitNodeList() { Node* node_list_head = new Node[hash_status_.node_list_size_]; vector_ptr_.push_back(node_list_head); Node* tmp_node = node_list_head; Node* cur_node = tmp_node; for (uint32_t i = 1; i < hash_status_.node_list_size_; i++) { cur_node->next_node_ = tmp_node + i; cur_node = cur_node->next_node_; } hash_status_.node_list_free_size_ = hash_status_.node_list_size_; node_list_head_ = tmp_node; node_list_tail_ = cur_node; node_list_tail_->next_node_ = NULL; allow_create_new_node_ = true; create_new_node_limit_num_ = 0; create_new_node_num_ = 0; }什么意思
时间: 2024-04-21 15:25:33 浏览: 94
这段代码是一个函数,名称为 InitNodeList,它的作用是初始化一个节点列表。这个节点列表是以链表的形式实现的,每个节点都是一个 Node 类型的对象。函数中的代码逐步创建了节点列表。具体来说,它首先创建了一个节点列表头,然后把它作为第一个节点放入了一个 vector 容器中。接下来,它使用一个循环创建了剩下的节点,每个节点都链接到前一个节点的 next_node_ 指针上。最后,函数设置了节点列表的其他属性,如空闲节点数、列表头尾指针等,以及一些标志位,如允许创建新节点、创建新节点数限制等。
相关问题
Node* ApplyForOneNode() { if (node_list_head_ != NULL) { if (hash_status_.node_list_free_size_ > 1) {//最后一个不能被用完 Node* tmp = node_list_head_ ; node_list_head_ = node_list_head_->next_node_; tmp->next_node_ = NULL; tmp->used_flag_ = 1; hash_status_.node_list_free_size_--; return tmp; } else { if (allow_create_new_node_ == false) { return NULL; } else if (create_new_node_limit_num_ != 0 && create_new_node_limit_num_ <= create_new_node_num_) { return NULL; } else { Node* tmp_node = new Node[kDefaultAddSize]; Node* cur_node = tmp_node; if (!tmp_node) { return NULL; } vector_ptr_.push_back(tmp_node); for (uint32_t i = 1; i< kDefaultAddSize; i++) { cur_node->next_node_ = tmp_node + i; cur_node = cur_node->next_node_; } create_new_node_num_ += kDefaultAddSize; hash_status_.node_list_free_size_ += kDefaultAddSize; hash_status_.node_list_size_ += kDefaultAddSize; double_link_.dwMaxNodeNums += kDefaultAddSize; node_list_head_->next_node_ = tmp_node; node_list_tail_ = cur_node; node_list_tail_->next_node_ = NULL; Node* tmp = node_list_head_ ; node_list_head_ = node_list_head_->next_node_; tmp->next_node_ = NULL; tmp->used_flag_ = 1; hash_status_.node_list_free_size_--; return tmp; } } } return NULL; }什么意思
这段代码是一个函数,名称为 ApplyForOneNode,它的作用是申请一个节点。节点是存储在一个链表中的,每个节点都是一个 Node 类型的对象。函数首先判断节点链表是否为空,如果不为空,就从链表头取出一个未使用的节点,将其标记为已使用,并返回该节点的指针。如果链表中没有未使用的节点,函数会考虑是否允许创建新节点。如果不允许,或者已经达到了创建新节点的限制次数,函数会返回 NULL,表示申请节点失败。否则,函数会创建一些新节点,并将它们添加到节点链表中,然后再次从链表头取出一个未使用的节点,将其标记为已使用并返回其指针。如果节点链表为空,函数也会返回 NULL,表示申请节点失败。
class HashValue { public: class ValueNode { public: ValueNode() { next_node_ = NULL; } ValueNode* next_node_; Value value_; }; HashValue<Value>(uint32_t size = kDefaultMapSize) { value_status_.total_size_ = size; value_status_.free_num_ = value_status_.total_size_; Init(); } ~HashValue<Value>() { for (int i = 0;i < vec_memptr_.size();i++) { delete []vec_memptr_[i]; } vec_memptr_.clear(); } void Init() { ValueNode* head_node = new ValueNode[value_status_.total_size_]; vec_memptr_.push_back(head_node); ValueNode* tmp_node = head_node; ValueNode* cur_node = tmp_node; for (uint32_t i = 1; i< value_status_.total_size_; i++) { cur_node->value_.node_ptr_ = (void*)cur_node; cur_node->next_node_ = tmp_node + i; cur_node = cur_node->next_node_; } value_status_.free_num_ = value_status_.total_size_; node_list_head_ = tmp_node; node_list_tail_ = cur_node; node_list_tail_->next_node_ = NULL; node_list_tail_->value_.node_ptr_ = (void*)node_list_tail_; rphead = NULL; }什么意思
这段代码定义了一个模板类 HashValue,它包含了一个嵌套类 ValueNode,用于组织哈希表中的值。HashValue 还有一个成员变量 value_status_,它记录了哈希表中的元素个数和空闲元素个数。HashValue 还有一些成员函数,如构造函数和析构函数,以及 Init() 函数,用于初始化哈希表。在 Init() 函数中,它首先创建了一个大小为 value_status_.total_size_ 的 ValueNode 数组,并将其加入到 vec_memptr_ 向量中,然后使用循环将每个 ValueNode 连接起来,形成一个单向链表。其中,rphead 变量没有被定义,可能是代码中的一个错误。
阅读全文