是否有可能有效地检查STL std :: deque erase是否成功?

时间:2011-06-09 15:18:33

标签: c++

我们正在尝试使用std :: deque erase成员函数。 std :: deque erase(iterator)成员函数的返回值是一个随机访问迭代器,指向函数调用擦除的最后一个元素之后的元素的新位置,如果操作擦除了该函数,则该容器结束序列中的最后一个元素。

我们想知道是否有可能有效地检查STL std :: deque erase是否成功。谢谢。我们的代码摘录如下所示:

typedef std::multimap<char *,Range>::const_iterator I;
std::pair<I,I> b = mmultimap.equal_range(TmpPrevMapPtr);

for (I i=b.first; i != b.second; ++i){ 
   std::deque<Range>::iterator iter;
   std::deque<Range>::iterator it;
   iter = std::lower_bound(ranges_type.begin(),ranges_type.end(),i->second);
   if (iter != ranges_type.end() && !(i->second < *iter)){
       it = ranges_type.erase(iter);
   }
}

3 个答案:

答案 0 :(得分:3)

std::deque::erase总是成功的(当然,它会得到一个无效的迭代器,在这种情况下结果是未定义的)。

答案 1 :(得分:2)

检查出队的大小是否因您删除的元素数量而减少 关于对效果的关注,dequeue::size的时间复杂度为O(1)

#include <iostream>
#include <deque>
using namespace std;

int main ()
{
  unsigned int i;
  deque<unsigned int> mydeque;

  // set some values (from 1 to 10)
  for (i=1; i<=10; i++) mydeque.push_back(i);

  cout << "\nmydeque contains:"<<mydeque.size();

  // erase the 6th element
  mydeque.erase (mydeque.begin()+5);

  // erase the first 3 elements:
  mydeque.erase (mydeque.begin(),mydeque.begin()+3);

  //Total Elements erased = 4

  cout << "\nNow mydeque contains:"<<mydeque.size();

  return 0;
}

答案 2 :(得分:1)

如果擦除成功,则双端队列将比原来短。或者,将代码包装在一个函数中(在任何情况下你都应该这样做)并让函数返回是否发生擦除。