索引处的deque::insert()
deque::insert() at index?
如何在线性时间中将一堆项目insert()
deque
中间?
(我插入的项目是无法通过STL样式迭代器访问的。(
有一个deque::insert(iterator pos, const T&x)
函数,将位置pos
作为deque::iterator
,还有一个元素。使用此方法,可以逐个插入所有元素。deque.begin()+index
可以很容易地获得pos
(如果您有一个要在其之前插入元素的索引(。insert
方法为新插入的元素返回一个迭代器,只需将返回的迭代器递增即可获得下一个位置:
deque::iterator it = myDeque.begin()+index;
while(n--) {
it = myDeque.insert(it, currentElement);
it++;
currentElement = ... // However you get your next element ...
}
然而,这将占用O(n*k)
时间,因为单个元素的插入是(iirc(线性时间运算iirc。
第二个重载是deque::insert(iterator pos, InputIterator f, InputIterator l)
:记住,简单的指针也满足STL输入迭代器的要求,所以如果你有一个长度为n
的C风格数组T array[]
包含你的元素,你可以用插入这个数组中的所有元素
d.insert(pos, array, array+n);
该操作可以在线性时间中执行,即O(n+k)
。我不确定标准是否保证了这一点,但我认为大多数实现都会有效地做到这一点。
编辑
我很快检查了微软的实现,他们通过push_back
或push_front
的序列来实现,无论哪个更接近pos
,然后将元素旋转到它们的最终位置,这保证了上述O(n+k)
的复杂性。当然,这也可以"手工"完成,比如:
size_type _Off = pos - d.begin();
size_type _Oldsize = d.size();
if (_Off <= d.size() / 2)
{ // closer to front, push to front then rotate
while (hasMoreElements())
push_front(nextElement()); // prepend flipped
size_type _Num = d.size() - _Oldsize;
std::reverse(d.begin(), d.begin() + _Num); // flip new stuff in place
std::rotate(d.begin(), d.begin() + _Num, begin() + _Num + _Off);
}
else
{ // closer to back
while (hasMoreElements())
push_front(nextElement()); // prepend flipped
std::rotate(begin() + _Off, begin() + _Oldsize, end());
}
(我从微软的deque::insert
实现中复制了代码,删除了调试代码和异常处理,
调用需要插入一系列项目的insert方法,请参阅此处列出的第三个方法:
http://msdn.microsoft.com/en-us/library/zcww84w5(v=vs.71(.aspx
并且,创建自己的STL样式迭代器来访问要插入的项。参见:
C++中的自定义迭代器
输入:
Deque:长度=l,
新项目(m=新项目数量(
算法:
创建一个新的deque(1(
将所有项目从原始deque复制到您想要插入新项目的位置(p(
添加新项目(m(
添加来自旧deque(m-p(的项目
也许你可以使用新的deque,但最坏的情况是:
将新的deque复制到旧的deque上(完全清除后:(:
成本(l+m(
因此,最糟糕的成本是:原始大小*2+线性的新项目。
这里不计算"透明甲板",但它也是线性的(最坏的情况下(。
将插入点后的所有元素添加到向量中
删除插入点之后的所有元素
将新范围追加到deque
将矢量附加到deque。
这是O(2n(的最坏情况,而不是O(n^2(。
- Insert函数不适用于2 if语句C++
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- Capacity of a deque
- 在调试模式下引发C++ "deque iterator not dereferencable"异常
- C++中deque数据结构的大O是什么?
- 如何使用C++为我的容器 Deque 设置最大大小?
- 为什么 gcc 会给我可能未初始化的警告 deque::insert 带有过滤范围
- C++ deque 消费者总是从生产者那里得到空队列
- Deque 迭代器超出范围
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- 有没有函数可以在擦除 c++ 中获取 deque.begin() 的 int 值?
- 为什么 deque 比队列快?
- Deque 中元素的随机访问如何提供恒定的时间复杂度?
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 为什么使用 <uint8_t>MSVC 2015 编译器的 std::vector::insert 比 std::copy 快 5 倍?
- 如果迭代器没有因插入而无效,则使用std::find和C::insert()是线程安全的
- C++:如何将unique_ptr推送到deque
- 索引处的deque::insert()
- stl deque::insert()的复杂性