在 C++ 中,“const_iterator”与“const iterator”相同吗?

Sad*_*egg 4 c++ standards iterator

aconst_iterator与 一样吗const iterator?如果不是有什么区别?如果是的话,为什么标准使用const_iteratorwhenconst iterator已经有意义?

例如,这两个声明完全相同吗?

string& replace (const_iterator i1, const_iterator i2, const string& str);

string& replace (const iterator i1, const iterator i2, const string& str);

Ted*_*gmo 8

不,它们不一样。

与任何const对象一样,您无法更改const iterator

// ++it gives error below since we try to change it:
for(const std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {}
Run Code Online (Sandbox Code Playgroud)

const iterator但是,您可以更改 a指向的对象的值:

// this is ok (assuming there is at least one element in the vector):
const std::vector<int>::iterator it = vec.begin();
*it = 10;
Run Code Online (Sandbox Code Playgroud)

Aconst_iterator是可变的,但您不能更改迭代器指向的对象:

// ++it is ok below:
for(std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) {
    *it = 10;   // error:  `*it`  is an `int const&`
}
Run Code Online (Sandbox Code Playgroud)

使用 a const const_iterator,您既不能更改迭代器也不能更改它所指向的内容。

const std::vector<int>::const_iterator it = vec.begin();
++it;                     // error
*it = 10;                 // error
std::cout << *it << '\n'; // ok
Run Code Online (Sandbox Code Playgroud)

一个构造的例子来说明:

struct foo {
    using const_iterator = char const*;
    using iterator = char*;

    const_iterator cbegin() const { return data; };
    const_iterator cend() const { return data + sizeof data; };
    const_iterator begin() const { return cbegin(); }
    const_iterator end() const { return cend(); }
    iterator begin() { return data; };
    iterator end() { return data + sizeof data; };

    char data[2];
};
Run Code Online (Sandbox Code Playgroud)

如上所示,const_iteratoriterator是用户定义的类型定义。只有按照惯例,这些名称才被称为它们的名称。在创建应该与其他类良好配合的容器时,使用这些常规名称也很有帮助,因为这些类型定义通常用于创建或指定实例/类型。不过,这些名称const_iteratoriterator没有赋予这些别名任何特殊属性。这一切都取决于班级的创建者。