C++ Don';我不明白这个准则
这是最高效率,但我不明白。 有人能告诉我为什么吗?你看过告示了吗 位置 提示可以插入元素的位置。 c++98 如果位置指向 将位于插入元素之前的元素C++ Don';我不明白这个准则,c++,stl,C++,Stl,这是最高效率,但我不明白。 有人能告诉我为什么吗?你看过告示了吗 位置 提示可以插入元素的位置。 c++98 如果位置指向 将位于插入元素之前的元素 它指向20,在25之前。std::set使用平衡树结构。当您调用insert时,您可以向实现提供一个提示,它可以使用该提示加快插入速度 想想常规的insert方法在常规二叉搜索树中的工作原理。您从根节点开始,必须使用常规检查向下进行: myset.insert (it,25); // max efficiency i
它指向20,在25之前。
std::set
使用平衡树结构。当您调用insert
时,您可以向实现提供一个提示,它可以使用该提示加快插入速度
想想常规的insert
方法在常规二叉搜索树中的工作原理。您从根节点开始,必须使用常规检查向下进行:
myset.insert (it,25); // max efficiency inserting
myset.insert (it,24); // max efficiency inserting
void插入(节点*当前、常数和值)
{
if(node==nullptr)//在这里构造我们的新节点
否则如果(值<节点->当前)插入(当前->左侧,值);
如果(值>节点->当前)插入(当前->右侧,值);
}
无效插入(常数T和值)
{
插入(根,值);
}
在平衡树中,必须(平均)执行O(logn)
比较以插入给定值
但是,假设不从根节点开始,而是为实现提供一个开始节点,实际插入将在该节点发生。例如,在上面,我们知道24和25将成为包含
20
的节点的子节点。因此,如果我们从该节点开始,我们不需要进行O(logn)
比较-我们可以直接插入节点。这就是“最大效率”插入的含义。一般来说,std::set
必须查找插入的位置;这
查找是O(lgn)。如果您提供“提示”(附加
迭代器)在应该进行插入的位置
实现将首先检查此提示是否正确(哪一个
可以在O(1)中完成,如果是,则在那里插入,从而跳过
O(lgn)向上看。当然,如果提示不正确,它会
然后返回到插入,就好像它没有得到提示一样
您经常使用提示的情况有两种:第一种
插入已排序数据的序列时。在里面
在这种情况下,提示是结束迭代器,因为如果数据是
已排序的每个新值实际上都将插入
结束。第二种是使用插入复制到集合中时
迭代器。在本例中,“提示”(可以是任何内容)
不仅仅是因为句法上的原因:你不能使用
后插入迭代器
或前插入迭代器
,
因为std::set
没有push_back
或push_front
,并且
简单的插入迭代器需要迭代器来告诉它
在何处插入;此迭代器将被传递到
insert
请允许我给您一个警告:。改用cppreference.com。@Manu343726:什么意义上的过时?它列出了C++11的功能…我将同时看这两个功能,因为我听说只看一面会使您失明:d如果插入的元素立即位于提示之前,函数将进行优化,而不是提示是否位于元素之前。没有“更近”的说法。如果元素应该在提示之前插入,则插入为O(1)。否则,O(lgn)。
myset.insert (it,25); // max efficiency inserting
myset.insert (it,24); // max efficiency inserting
void insert(node* current, const T& value)
{
if(node == nullptr) // Construct our new node here
else if(value < node->current) insert(current->left, value);
else if(value > node->current) insert(current->right, value);
}
void insert(const T& value)
{
insert(root, value);
}