什么时候使用迭代器的`value_type`?
Posted
技术标签:
【中文标题】什么时候使用迭代器的`value_type`?【英文标题】:When is a `value_type` of an iterator used? 【发布时间】:2016-01-11 23:14:04 【问题描述】:我试图了解何时实际使用 iterator::value_type
。
因为,迭代器的所有操作符,似乎只使用iterator::pointer
和iterator::reference
。
问题:iterator::value_type
真的用于某事吗?
额外问题:一个迭代器会继承自
std::iterator<std::random_access_iterator_tag, int, std::ptrdiff_t, bool*, bool&>
提出一些语义问题?
编辑:要理解我问这个问题的原因,是因为我正在为 pointer
和 reference
是代理类的类型开发迭代器。
【问题讨论】:
关于 EDIT,在这种情况下,将value_type
作为单独的 typedef
肯定很有用,因为 remove_reference_t<decltype(*begin)>
不再属于基础值的类型,而是具有以下类型代理。
【参考方案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;
当然你可以用在C++14中我想不出一个很好的用法,因为你可以函数返回时有自动类型推导。decltype(*begin)
代替,但是使用value_type
看起来更简洁更优雅。
编辑 正如@Luc Danton 在评论中提到的,使用decltype(*begin)
大部分时间都会产生引用,所以你需要std::remove_reference
,这看起来很讨厌。所以value_type
派上用场了。
【讨论】:
如果It
是例如std::vector<int>::iterator
,然后decltype(*begin)
是int&
,它对应于reference
而不是value_type
。
@LucDanton 甚至不能保证返回值类型,因为原则上迭代器可以通过代理实现,不一定是指针。
请注意,当我说reference
时,我的意思是std::iterator_traits<It>::reference
,它不需要是引用类型(很令人困惑)。它对应于*it
的类型(对于适当的it
),因此与decltype(*begin)
的关系。
是的,你是对的,我也意识到了这一点,这就是为什么我还评论了代理版本,在这种情况下,参考只是您通过operator=
编写的代理。
使用std::iterator_traits<It>::value_type
似乎比It::value_type
更好,因为它也可以处理指针。以上是关于什么时候使用迭代器的`value_type`?的主要内容,如果未能解决你的问题,请参考以下文章