错误:在只读对象中分配成员
error: assignment of member in read-only object
IDEONE: http://ideone.com/uSqSq7
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
struct node
{
int value, position;
bool left, right;
bool operator < (const node& a) const
{
return value < a.value;
}
};
int main()
{
int n;
cin >> n;
vector < node > a(n);
set < node > s;
for (auto &i: a)
{
cin >> i.value;
i.left=i.right=0;
}
a[0].position=1;
s.insert(a[0]);
for (int i=1; i<n; i++)
{
auto it=s.upper_bound(a[i]);
auto it2=it; --it2;
if (it==s.begin())
{
a[i].position=2*it->position;
s.insert(a[i]);
it->left=1;
}
else if (it==s.end())
{
a[i].position=2*(--it)->position+1;
s.insert(a[i]);
it->right=1;
}
else
{
if (it2->right==0)
{
a[i].position=2*it2->position+1;
s.insert(a[i]);
it2->right=1;
}
else
{
a[i].position=2*it->position;
s.insert(a[i]);
it->left=1;
}
}
}
for (auto i: a) cout << i.position << ' ';
}
当我编译此代码时,我得到
error: assignment of member ‘node::right’ in read-only object
我认为这与bool operator <
中的const
有关,但我无法摆脱它,因为有必要创建集合。
Angelika Langer曾经写过一篇关于这个问题的文章:Set Iterators是可变的还是不可变的?。
您可以通过将set
排序无关紧要的Node
成员定义为mutable
来解决此问题:
mutable bool left, right;
(请参阅IDEone中的建筑版本。
就个人而言,我会考虑使用map
将不可变部分映射到可变部分的设计。
问题:
请记住,std::set 中的键是常量。将密钥插入密钥集后,无法更改密钥。因此,当您取消引用迭代器时,它必然返回一个常量引用。
const node& n = (*it);
n->left = 1; //It will not allow you to change as n is const &.
溶液:
正如Ami Tavory回答的那样,你可以将左和右声明为可变的。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- C++类成员:堆栈与堆分配
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 在成员初始值设定项列表中分配unique_ptr
- 对象分配-成员函数的使用无效错误
- 如何确定对象是否已分配成员
- 我可以分配成员访问操作员的返回值吗?
- lambda表达式分配成员函数指针
- 如何在C++中从命令行参数分配成员变量
- 为什么分配成员会引发 NullReferenceException
- 错误:在只读对象中分配成员
- 在只读对象中分配成员 '
- 分配成员变量时出现分段错误
- 具有动态分配成员的结构体的向量
- 按值分配成员对象:我的假设是否正确
- 创建std::shared_ptr来分配成员变量时内存泄漏
- 处理包含动态分配成员的对象向量