如何删除 const_iterator 的常量?

新手上路,请多包涵

作为这个问题的延伸 const_iterators 更快吗? ,我对 const_iterators 还有一个问题。如何删除 const_iterator 的常量?尽管迭代器是指针的广义形式,但 const_iteratoriterator s 仍然是两个不同的东西。因此,我相信,我也不能使用 const_cast<>const_iterator 转换为 iterator s。

一种方法可能是您定义一个迭代器,它移动’直到 const_iterator 指向的元素。但这看起来是一个线性时间算法。

关于实现这一目标的最佳方法的任何想法?

原文由 aJ. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 893
2 个回答

在 C++11 中有一个恒定时间复杂度的解决方案:对于任何序列、关联或无序关联容器(包括所有标准库容器),您可以使用空范围调用范围擦除成员函数:

 template <typename Container, typename ConstIterator>
typename Container::iterator remove_constness(Container& c, ConstIterator it)
{
    return c.erase(it, it);
}

范围擦除成员函数有一对 const_iterator 参数,但它们返回一个 iterator 。因为提供了一个空范围,所以对擦除的调用不会更改容器的内容。

向 Howard Hinnant 和 Jon Kalb 致敬这一技巧。

原文由 James McNellis 发布,翻译遵循 CC BY-SA 3.0 许可协议

不幸的是,线性时间是唯一的方法:

 iter i(d.begin());
advance (i,distance<ConstIter>(i,ci));

其中 iter 和 constIter 是合适的 typedef,d 是您正在迭代的容器。

原文由 PaulJWilliams 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题