什么时候使用迭代器的`value_type`?

Posted

技术标签:

【中文标题】什么时候使用迭代器的`value_type`?【英文标题】:When is a `value_type` of an iterator used? 【发布时间】: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; 不再属于基础值的类型,而是具有以下类型代理。 【参考方案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 更好,因为它也可以处理指针。

以上是关于什么时候使用迭代器的`value_type`?的主要内容,如果未能解决你的问题,请参考以下文章

STL 迭代器继承:“value_type”未命名类型

c++中迭代器的问题为啥这样会报错?

STL迭代器

反向迭代器

反向迭代器

问题记录