如何更改集合中的对象子成员

发布于 2024-11-05 01:52:06 字数 251 浏览 0 评论 0原文

我正在使用一套来容纳物体。我想更改集合中的第一个对象。这是我尝试过的:

set<myClass>::iterator i = classlist.begin();
i->value = 0;

这是我得到的错误:

error: read-only variable is not assignable

变量如何变为只读?怎样才能改变呢?

I am using a set to hold objects. I want to make changes to the first object in the set. This is what I tried:

set<myClass>::iterator i = classlist.begin();
i->value = 0;

This is the error I get:

error: read-only variable is not assignable

How did the variable become read-only? How can it be changed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

贱人配狗天长地久 2024-11-12 01:52:06

集合中的内容实际上是只读的 - 您无法就地更改集合成员的值。您所能做的就是删除它,然后添加具有所需新值的新成员。由于 std::set 的二叉树实现,此限制是必要的。

The things in a set are effectively read-only - you cannot change the value of a member of a set in situ. All you can do is remove it, and add a new member with the required new value. This restriction is necessary because of the binary tree implementation of std::set.

腻橙味 2024-11-12 01:52:06

如果您确实必须修改 set 中的元素,则该元素必须是
一旦从集合中删除并重新插入到该集合中。
例如:

set<myClass>::iterator i = classlist.begin();
myClass c = *i;
c.value = 0;
classlist.erase( i );
classlist.insert( c );

如果 myClassoperator< 不引用 value 成员,
您可以使用 std::map 而不是 set
假设一个新的 myClass 没有 value 成员,
并假设value成员的类型为T
然后 std::map< newMyClass,T>就可以达到目的了。

If you really have to modify the element in set, the element has to be
once erased from the set and re-inserted in that set.
For example:

set<myClass>::iterator i = classlist.begin();
myClass c = *i;
c.value = 0;
classlist.erase( i );
classlist.insert( c );

If operator< for myClass doesn't refer the value member,
you can use std::map instead of set.
Assuming a new myClass which doesn't have value member,
and assuming that the type of value member is T,
then std::map< newMyClass, T > will meet the purpose.

岁月苍老的讽刺 2024-11-12 01:52:06

这在 VS2008 下编译:

#include <set>

struct myClass{
    int value;
    int comp;
};

bool operator<(const myClass& lhs,const myClass& rhs){
    return lhs.comp<rhs.comp;
}

int main(){

    std::set<myClass> classlist;
    myClass c;
    classlist.insert(c);

    std::set<myClass>::iterator i=classlist.begin();
    i->value=0;

    return 0;
}

但这只是巧合。 operator< 比较 comp 成员,然后我们更改 value 成员。

This compiles under VS2008:

#include <set>

struct myClass{
    int value;
    int comp;
};

bool operator<(const myClass& lhs,const myClass& rhs){
    return lhs.comp<rhs.comp;
}

int main(){

    std::set<myClass> classlist;
    myClass c;
    classlist.insert(c);

    std::set<myClass>::iterator i=classlist.begin();
    i->value=0;

    return 0;
}

But this only works by coincidence. operator< compares the comp members and we change the value member.

白馒头 2024-11-12 01:52:06

在 Visual Studio 2010 中,当 Microsoft 更新 STL 时,他们使所有迭代器保持不变。所以 set::iterator 和 set::const_iterator 是相同的。

原因是因为在一个集合中,关键是数据本身,当你改变你的数据时,也就改变了关键,这是不可以的。

微软 C++ 团队在此处报告了这一重大变化:
http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-writing-changes-in-visual-studio-2010-beta-1.aspx

如果您想要修改数据,并且不想删除和插入数据,那么可以使用地图。

in Visual Studio 2010 when Microsoft updated the STL, they made all iterators constant. So set::iterator and set::const_iterator are the same.

The reason is because in a set, the key is the data itself, and when you change your data, and thus the key, which is a no no.

The microsoft C++ team reported on this breaking change here:
http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx

If you want to be modifying your data, and don't want to be removing and inserting, then use a map instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文