【问题标题】:copying a container that was passed by iterators复制由迭代器传递的容器
【发布时间】:2015-11-17 07:28:06
【问题描述】:

我有通过开始和结束接受容器的功能:

template <class Titerator>  int foo(const Titerator& begin_data, const Titerator& end_data);

在这个函数中我想做一些类似的事情:

While there is reaming data{
  Do something on the remaining data
  delete some of the remaining data that satisfied a condition
}

当然铰孔数据是原始数据的副本(原始数据不会改变)

我想不出办法。我需要复制数据,这样我就可以在上面做任何我想做的事情,但是当我不知道容器是什么时如何复制它?它是向量、列表还是什么?我只有开头和结尾。 如何在不丢失通用概念的情况下定义此功能?

【问题讨论】:

  • 我建议重命名模板参数...
  • 如果你不介意可以告诉我:建议什么以及为什么?
  • 这是reason

标签: c++ templates c++11 iterator


【解决方案1】:

如果您想创建数据的副本,您不应该关心它最初位于哪个容器中。这就是迭代器的美妙之处:您不必关心。

根据要对该副本执行的操作选择副本的容器。

  • 想要在中间频繁删除?考虑std::list
  • 想要缓存友好的连续访问?考虑std::vector
  • ...等等。

像这样:

template <class Titerator>
int foo(const Titerator& begin_data, const Titerator& end_data)
{
  std::list<typename std::iterator_traits<Tierator>::value_type> myCopy{begin_data, end_data};
  // work on myCopy
}

【讨论】:

  • 谢谢..这似乎合乎逻辑。但总的来说,有没有办法将它复制到相同的容器类型?
  • @HumamHelfawi 不。从“迭代器”到“容器”没有通用的方法。迭代器甚至根本不需要对应于容器——例如,原始指针满足迭代器概念的所有要求。更别提Boost.Iterator之类的东西了。
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2015-01-01
  • 1970-01-01
  • 2016-05-01
  • 2012-07-11
  • 1970-01-01
相关资源
最近更新 更多