为什么在使用 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
考虑下面的代码,
#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 to25
. After the insertion, it points to77
.
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