如何有效地从C++集中删除开始和结束元素
How to effectively delete beginning and ending elements from a set in C++?
如果我设置如下:
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 算法通常定义为对开始/结束迭代器对进行操作。因此,您可能希望使用一对按需创建的迭代器来实现视图。
相关文章:
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何显示函数开始、结束行和函数体?
- C++ 从具有开始位置和结束位置的列表中删除
- C++程序从主程序开始执行并在主程序结束?
- 如何使用Chrono或ctime libaray输入设置的开始和结束时间
- 是否可以在基于范围的 for 循环中使用模板化的开始/结束方法
- 重写自定义数组类的运算符/开始/结束
- 取代表开始/结束的数字对,并删除重叠
- 如何为一个类提供多个开始/结束代理
- 映射大小() > 0 但开始() == 结束()
- 将数组作为函数参数传递,并在其上调用开始/结束方法
- 正则表达式,捕获 4 个被 括起来的数字.或行开始/结束
- C++ 指针上的开始/结束 (arr) - 调用 'begin(int**&)' 没有匹配函数
- 重载指向集合的指针的开始/结束是否是个好主意
- 检测 D3D 挂钩中的帧开始/结束
- C ::P在循环开始结束时发出声音循环声音
- 三次样条:开始/结束段插值
- Std::regex,匹配字符串的开始/结束
- 匹配开始/结束分析调用