C++ Don';我不明白这个准则

C++ Don';我不明白这个准则,c++,stl,C++,Stl,这是最高效率,但我不明白。 有人能告诉我为什么吗?你看过告示了吗 位置 提示可以插入元素的位置。 c++98 如果位置指向 将位于插入元素之前的元素 它指向20,在25之前。std::set使用平衡树结构。当您调用insert时,您可以向实现提供一个提示,它可以使用该提示加快插入速度 想想常规的insert方法在常规二叉搜索树中的工作原理。您从根节点开始,必须使用常规检查向下进行: myset.insert (it,25); // max efficiency i

这是最高效率,但我不明白。 有人能告诉我为什么吗?

你看过告示了吗

位置 提示可以插入元素的位置。 c++98 如果位置指向 将位于插入元素之前的元素


它指向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);
}