【问题标题】:Is it possible to efficiently check whether STL std::deque erase succeded?是否可以有效地检查 STL std::deque 擦除是否成功?
【发布时间】:2011-09-11 19:38:27
【问题描述】:

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

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

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);
   }
}

【问题讨论】:

  • 为什么会同时标记linuxvisual-c++?这似乎是一个奇怪的组合。此外,您可能想要修复您的代码块。
  • Sven ,我们为原型重复数据删除器尝试的代码必须在 Linux 和 Windows Visual C++ 上运行。谢谢。

标签: c++


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我们想知道是否可以有效地确定 std::deque::erase 是否获得无效的迭代器?谢谢。
  • 不,只需继续检查 end() 并确保在使迭代器无效的操作之后不要重复使用迭代器。对于std::deque,规则是如果在序列的开头或结尾执行擦除,则只有迭代器和对已擦除元素的引用无效。如果删除发生在双端队列的中间,所有的迭代器和引用都会失效。
  • 感谢您的回复。如果我们删除双端队列的最后一个元素,stq::deque::erase(iterator) 是否有可能返回 end()。如果我们检查 end() ,我们可能会忽略 std::deque::erase 擦除双端队列最后一个元素的情况。谢谢。
  • @Frank,我认为你只能接受一个答案,但我不介意这不是我的 :-)
【解决方案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;
}

【讨论】:

  • 感谢您的回答。找到双端队列 0(1) 或 0(N) 的大小需要多长时间?谢谢。
  • 感谢您对代码示例的回答并验证 std::deque::size 是 0(1) 操作。我们将尝试您的回答。谢谢。
【解决方案3】:

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

【讨论】:

  • @Neil Butterworth,谢谢您的回答。你知道 std::deque::size 是 BIG-O(1) 还是 BIG-o(N) 操作?谢谢。
  • @Frank 我不相信标准规定了双端队列 size() 所需的复杂性。
  • @Neil Butterworth。谢谢您的回复。我们是否应该查看 Microsoft STL 和 GNU STL 实现代码来找出 deque 中 size() 的时间复杂度。或者,在 Microsoft STL 或 GNU LINUX STL 中是否有其他地方可以找到 std::deque::size() 的时间复杂度?谢谢。
  • @Frank 使用源代码!对于 GCC,它似乎是 O(1),但不要相信我的话。
  • @Neil Butterworth,感谢您的回复。我们将为 std:::deque::size() 使用 GCC 源代码和 Microsoft STL 代码。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多