为什么引入了特殊类型const_iterator
?
为什么不使某些迭代器内部变量可变,并选择标准C ++ const iterator
?
const iterator
曾经讨论过吗?
答案 0 :(得分:3)
由于指针是迭代器的一种特殊情况,让我们看一下此示例:
using float_ptr = float *;
float f = 0;
const float_ptr ptr = &f;
*ptr = 1.0; // fine changes variable f
ptr = nullptr; // fails, ptr is const
发生了什么事?我们有指向非常量数据的常量指针。但是我们需要非const指针来指向const数据。显而易见的解决方案是:
using const_float_ptr = const float *;
这里是附加的const_iterator
类型。迭代器的问题通常是相同的:const iterator
的含义与const_iterator
的含义不同,最重要的是,返回的const对象按值实际上在C ++中没有用,因为您无法执行只能分配给const对象。
答案 1 :(得分:1)
iterator
从概念上讲是线性空间上的一个位置。在该空间中的每个位置都有一个对象。
const iterator
个确实存在。此迭代器始终指向相同的位置。例如,您不能执行i++
。即使您无法更改指向的位置,也可以更改存储在该位置的对象:例如*i=10
应该将const_iterator
的迭代器读取为const ...:这与const iterator
相反,您可以更改指向的位置,执行i++
被允许,但是您可以永远不要更改指标值:不允许*i=10
。
所以您有4个版本:迭代器,const迭代器,const_iterator和const const_iterator!
答案 2 :(得分:0)
迭代器只是指针,它们的一些凌乱细节被抽象化了,如果允许编译器插入此类符号,则有可能插入调试信息。
因此,必须考虑将CV限定词应用于指针的不同方式,以及这些方式与我们处理直接值的方式有何不同。
例如,在C ++中,以下类型声明不等效:
//Gonna leak lots of memory, don't worry about that for now
int * ptr = new int(1);
*ptr = 2;
ptr = new int(3);
int const* ptr2 = new int(4);
//*ptr2 = 5;//Not permitted, is a pointer-to-const, meaning the data it points to is immutable
ptr2 = new int(6);
ptr2 = ptr;
*ptr = 4;
//*ptr2 = 5;//immutability of data is enforced by the alias, not by the underlying data.
//ptr can still modify its own data, but ptr2 may not, even if it's the same data.
int * const ptr3 = new int(7);
*ptr3 = 8;
//ptr3 = new int(9);//Not permitted, is a const-pointer, meaning the pointer itself is immutable
//Note that the data being pointed to is NOT immutable, and can be freely altered
int const* const ptr4 = new int(10);
//*ptr4 = 11;//Not permitted, data pointed to is immutable
ptr4 = new int(12);//Not permitted, pointer is immutable
就C ++迭代器而言,可以认为const iterator
等同于上面显示的int * const ptr3
声明:可以随意操纵指向的数据,但不能更改指针本身。相反,const_iterator
等效于ptr2
,这意味着无法修改数据,但可以使指针指向其他内容。假设的const const_iterator
就像ptr4
,既不允许数据更改,也不允许指针本身更改。