为什么在C ++标准中没有const迭代器,而const_iterator?

时间:2018-08-21 17:50:09

标签: c++ c++14 language-lawyer c++-standard-library

为什么引入了特殊类型const_iterator

为什么不使某些迭代器内部变量可变,并选择标准C ++ const iterator

const iterator曾经讨论过吗?

3 个答案:

答案 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,既不允许数据更改,也不允许指针本身更改。