|
@@ -84,6 +84,7 @@ namespace nanxing_extend
|
|
|
static_assert(nanxing_extend::compare_admit<V>value);
|
|
|
private:
|
|
|
using Node=skip_node<K,V>;
|
|
|
+ using ptr=Node*;
|
|
|
using Nptr=Node**;
|
|
|
//由于C++的便利性我们考虑使用带头节点的跳表(C++允许对数据不进行初始化(默认构造函数))
|
|
|
Nptr head; //头节点
|
|
@@ -138,7 +139,7 @@ namespace nanxing_extend
|
|
|
[[nodiscard]] //这个返回值最好不要忽略否则很有可能会出现内存泄漏
|
|
|
skiplistre<V> insert(K _key,V _value) //如果相同的时候我们考虑将value返回因为value很可能会是一个指针,需要手动清空内存
|
|
|
{
|
|
|
- using ptr=Node*;
|
|
|
+
|
|
|
int rand_level=0;
|
|
|
ptr updata[max_level]={nullptr}; //用于更新的数组
|
|
|
int level=current_level-1;
|
|
@@ -187,22 +188,53 @@ namespace nanxing_extend
|
|
|
new_node=new skip_node(_key,_value,rand_level);
|
|
|
}
|
|
|
ptr tmp=nullptr;
|
|
|
- for(int i=0;i<=level;i++)
|
|
|
+
|
|
|
+ for(int i=0;i<=rand_level;i++)
|
|
|
{
|
|
|
tmp=updata[i]->next_node[i];
|
|
|
updata[i]->next_node[i]=new_node;
|
|
|
new_node->next_node[i]=tmp;
|
|
|
}
|
|
|
+ if(rand_level>current_level)
|
|
|
+ {
|
|
|
+ current_level=rand_level;
|
|
|
+ }
|
|
|
+ current_size++;
|
|
|
+ #ifdef SKIP_MAX_SIZE
|
|
|
+ return sk.result=Skip_result::full;
|
|
|
+ #endif
|
|
|
}
|
|
|
sk.Skip_result=Skip_result::successufl;
|
|
|
}
|
|
|
-
|
|
|
- skiplistre<V> search(K _key)
|
|
|
- {
|
|
|
|
|
|
+ [[nodiscard]]
|
|
|
+ skiplistre<V> search(K _key) noexcept //不涉及任何内存分配相关任务,因此是异常安全的
|
|
|
+ {
|
|
|
+ skipList<V> sk;
|
|
|
+ ptr tmp=head[current_level-1];
|
|
|
+ int tmp_level=current_level-1;
|
|
|
+ for(i=tmp_level;i>=0;i--)
|
|
|
+ {
|
|
|
+ while(tmp->next_node[tmp_level]!=nullptr)
|
|
|
+ {
|
|
|
+ if(tmp->next_node[tmp_level]->key>=_key)
|
|
|
+ {
|
|
|
+ if(tmp->next_node[tmp_level]->key==_key)
|
|
|
+ {
|
|
|
+ return sk.result=tmp->next_node[tmp_level]->key;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ break; //跳出开始下一层循环
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ tmp=tmp->next_node[tmp_level];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sk.result=Skip_result::fault;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
void init_skip() //直接生成随机数表
|
|
|
{
|
|
|
try{
|