通过迭代器分配给元素
Assigning to an element via iterator
我认为我们可以通过其非常量迭代器为容器的优雅分配一个新值。所以我试了一下:
#include<iostream>
#include<set>
typedef std::set<int>::iterator it;
std::set<int> set_int;
int main()
{
set_int.insert(1);
it i = set_int.begin();
*i = 11; //error: assignment of read-only location
}
并失败了。我为什么失败?
根据标准 N4431 §23.2.4/6 关联容器 [associaciative.reqmts](强调我的):
关联容器的iterator
属于双向迭代器类别。对于值类型与键类型相同的关联容器,迭代器和const_iterator都是常量迭代器。是的未指定迭代器和const_iterator是否为同一类型。[ 注意:在这种情况下,iterator
和 const_-iterator
具有相同的语义,并且 iterator
可转换为 const_iterator
。用户可以通过始终在其函数参数列表中使用 const_iterator
来避免违反一个定义规则。
std::set
是一个关联容器,其值类型与键类型相同,因此,std::set<T>::iterator
是一个常量迭代器。因此,你得到的失败是有充分理由的。
set
实际上没有非const
迭代器,因为它的元素是不可变的。如果您考虑一下,假设您通过迭代器更改密钥。为什么穷集会移动节点以保持树不变量等等?
有关更详细和细致的讨论,请参阅Angelika Langer的这篇文章。
>std::set
内部保持元素的顺序。它基本上是一个红黑树二进制实现,并使用 std::less<> 作为其默认比较器。因此,如果我稍微修改您的示例,如下所示:
typedef std::set<int>::iterator it;
std::set<int> set_int;
set_int.insert(1);
set_int.insert(6); //I added
it i = set_int.begin(); //error: assignment of read-only location
*i = 11;
11
不能放在 std::set 容器的第一个迭代器位置,因为它违反了它的顺序。
所以很明显,我们不能使用迭代器取消引用std::set
来更新元素。编译器不允许它,你会得到编译器错误。
相关文章:
- 访问动态分配列表中的元素
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- C++ 将元素分配给映射值时访问错误
- 如何通过查找迭代器结果分配给一组对的元素
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 在 CPP 中将元素分配给矢量
- 如何将元素分配给向量?
- 并行算法将向量的元素分配到另一个元素的元素
- 无法在重载运算符时将数组元素分配给类变量"="
- 将字符串元素分配给结构数组中的结构
- 为每个循环中的std :: vector的当前元素分配迭代器
- OpenCV:为矩阵元素分配新值
- 将矢量元素分配给字符变量
- 如何拥有一个带有类元素的向量,其中一些元素分配了构造函数参数
- 为什么std::deque在默认构造函数中为它的元素分配内存?
- C++将字符串的元素分配给一个新字符串