Sog*_*tar 14 c++ iterator const-iterator iterator-traits
为何选择STL
std::iterator_traits<const T*>::value_type
Run Code Online (Sandbox Code Playgroud)
与...的类型相同
std::iterator_traits<T*>::value_type
Run Code Online (Sandbox Code Playgroud)
为什么它的设计是这样的?首先不应该是const T而第二个是T吗?你应该如何采用底层const正确类型的迭代器?我知道你可以编写自己的模板类和专业化并从中获取
std::iterator_traits<const T*>::pointer
Run Code Online (Sandbox Code Playgroud)
但不应该有一个成员typedef持有它吗?
Vau*_*ato 14
Constness与值类型无关,因为值意味着副本.然而,这std::iterator_traits<const T*>::reference
是一个const T&
.
例如,您可以编写此函数:
template <class Iterator>
typename std::iterator_traits<Iterator>::value_type getValue(Iterator i)
{
return *i;
}
Run Code Online (Sandbox Code Playgroud)
无论Iterator是a const T *
还是a ,它都能完美地运行T *
.
Jon*_*ely 11
它允许我这样做:
std::iterator_traits<I>::value_type val = *iter;
val += 5;
doSomething(val);
Run Code Online (Sandbox Code Playgroud)
但是如果value_type
是const 那就更难了,因为我需要使用它remove_const
.
如果我不想获得可修改的值,则无论是否value_type
为const 都无关紧要:
const std::iterator_traits<I>::value_type cval = *iter;
std::iterator_traits<I>::reference ref = *iter;
Run Code Online (Sandbox Code Playgroud)
这两个都适用于const迭代器和非const迭代器,并且无论是否value_type
为const 都可以工作,但第一个示例仅适用于const迭代器(如果它们value_type
是非const).
你应该如何采用底层const正确类型的迭代器?
迭代器不一定具有自己的底层类型,迭代器通常引用某个范围或某些集合,而该集合具有底层类型.例如std::list<int>::const_iterator
,value_type
是std::list<int>::value_type
,但int
不是const int
.
你不一定想知道底层类型是什么,你更有可能想知道结果*iter
是什么,这就是iterator_traits<I>::reference
告诉你的.
归档时间: |
|
查看次数: |
1613 次 |
最近记录: |