【问题标题】:When is a `value_type` of an iterator used?什么时候使用迭代器的`value_type`?
【发布时间】:2016-01-11 23:14:04
【问题描述】:

我试图了解何时实际使用 iterator::value_type

因为,迭代器的所有操作符,似乎只使用iterator::pointeriterator::reference

问题:iterator::value_type 真的用于某事吗?

额外问题:一个迭代器会继承自

std::iterator<std::random_access_iterator_tag, int, std::ptrdiff_t, bool*, bool&>

提出一些语义问题?

编辑:要理解我问这个问题的原因,是因为我正在为 pointerreference 是代理类的类型开发迭代器。

【问题讨论】:

  • 关于 EDIT,在这种情况下,将 value_type 作为单独的 typedef 肯定很有用,因为 remove_reference_t&lt;decltype(*begin)&gt; 不再属于基础值的类型,而是具有以下类型代理。

标签: c++ c++11 iterator semantics


【解决方案1】:

我可以考虑在通用代码中使用它。假设您正在编写一个在 C++11 中总结一个范围的通用函数。你可以写成

template<typename It>
auto sum(It begin, It end) -> typename It::value_type
{
    typename It::value_type _sum{}; 
    // compute the sum
    return _sum;
}

当然你可以用decltype(*begin)代替,但是使用value_type看起来更简洁更优雅。在C++14中我想不出一个很好的用法,因为你可以函数返回时有自动类型推导。

编辑 正如@Luc Danton 在评论中提到的,使用decltype(*begin) 大部分时间都会产生引用,所以你需要std::remove_reference,这看起来很讨厌。所以value_type 派上用场了。

【讨论】:

  • 如果It 是例如std::vector&lt;int&gt;::iterator,然后decltype(*begin)int&amp;,它对应于reference 而不是value_type
  • @LucDanton 甚至不能保证返回值类型,因为原则上迭代器可以通过代理实现,不一定是指针。
  • 请注意,当我说reference 时,我的意思是std::iterator_traits&lt;It&gt;::reference,它不需要是引用类型(很令人困惑)。它对应于*it 的类型(对于适当的it),因此与decltype(*begin) 的关系。
  • 是的,你是对的,我也意识到了这一点,这就是为什么我还评论了代理版本,在这种情况下,参考只是您通过operator=编写的代理。
  • 使用std::iterator_traits&lt;It&gt;::value_type 似乎比It::value_type 更好,因为它也可以处理指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多