为什么在使用 const_iterators 时可以在向量中插入元素

Why elements can be inserted in a vector when using const_iterators

考虑下面的代码,

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(){
    vector<int> value{22, 23, 25, 34, 99};
    auto it = find(value.cbegin(), value.cend(), 25);
    value.insert(it, 77);
    return 0;
}

这里it是一个const_iterator。在插入之前,它指向25。插入后指向77。这不是修改吗?

A const_iterator 阻止您修改迭代器指向的元素,它不会阻止您修改容器本身。

在您的示例中,您正在查找元素 25 的迭代器,并在 25 之前插入 77。您没有修改值 25.

Before the insertion, it points to 25. After the insertion, it points to 77.

vector::insert 总是使插入点处和插入点之后的迭代器无效。因此,如果您在 insert 之后取消引用示例中的 it,这是未定义的行为。相反你可以做

it = value.insert(it, 77);
// it points to 77, the newly inserted element
// (it + 1) points to 25

cosnt_iterator 指向常量值。这意味着当您取消引用它时,它将 return const 对象。可以修改迭代器,但不能修改迭代器指向的对象。

vector<int> value{22, 23, 25, 34, 99};
std::vector<int>::const_iterator it = find(value.cbegin(), value.cend(), 25);
it = value.insert(it, 77); // valid 
*it = 77;                  // Error

Think 就像指向 const 对象的指针。当你声明

int const a = 10;
int const *ptr = &a;

那么ptr可以修改,但是ptr指向的对象不可以。

*ptr = 5         // Error
int const b = 0;
ptr = &b;        // Valid