如何有效地从C++集中删除开始和结束元素

How to effectively delete beginning and ending elements from a set in C++?

本文关键字:开始 结束 元素 删除 集中 有效地 C++      更新时间:2023-10-16

如果我设置如下:

set<int> dummyset = {2,3,4,5,6,7,8};
auto itr = dummyset.find(5);

如果我想从2 to 4中删除,我会输入dummyset.erase(dummyset.begin(), itr);

但这需要线性时间。

假设我打算总是想从任一端删除两个块,我可以只移动开始指针或结束指针(恒定时间(而不是删除每个元素(线性时间(吗?

例:

begin     end
|           |
V           V
1  2  3  4  5
// Delete {1,2} and {5} by moving pointers
1  2  3  4  5
      ^  ^
      |  |
  begin  end

你不能,你可能也不需要。

C++的算法采用迭代器对。因此,与其dummyset.begin()dummyset.end(),不如将调整后的迭代器传递给它们。

但是,如果您使用的是set成员函数(如成员.find()(,则无法绕过它 - 您需要实际擦除。没有办法告诉这些函数暂时作用于子范围而不是整个容器(我相信这是你所要求的(。

并不像你想象的那么糟糕。实现知道它在做什么,并且应该只在给定一系列要删除的元素的情况下重新平衡其内部树。

我怎样才能跳过实际擦除,而只是将开始指针或结束指针重置为 ITR,这可以在恒定时间内完成?

对于可移植代码,需要创建公开此功能的其他容器。

std::set有意限制对其底层指针的访问,因为在已建立的接口之外操作它们很容易引入对象泄漏、内存泄漏和未定义的行为,std::set用户会受到保护。

std 算法通常定义为对开始/结束迭代器对进行操作。因此,您可能希望使用一对按需创建的迭代器来实现视图。