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
我认为这与const
中的bool operator <
有关,但我无法摆脱它,因为有必要创建该集。
答案 0 :(得分:5)
Angelika Langer曾写过一篇关于此事的文章:Are Set Iterators Mutable or Immutable?。
您可以通过将Node
成员的set
成员定义为mutable
来解决此问题:
mutable bool left, right;
(参见building version in ideone。)
就个人而言,我会考虑使用map
将不可变部分映射到可变部分的设计。
答案 1 :(得分:0)
问题:
请记住,std :: set中的键是常量。在将密钥插入集合后,您无法更改密钥。因此,当您取消引用迭代器时,它必然会返回一个常量引用。
const node& n = (*it);
n->left = 1; //It will not allow you to change as n is const &.
解决方案:
正如Ami Tavory回答的那样,你可以声明左右是可变的。