Как изменить дочерние элементы объекта в наборе - PullRequest
2 голосов
/ 04 мая 2011

Я использую набор для хранения предметов.Я хочу внести изменения в первый объект в наборе.Вот что я попробовал:

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

Это ошибка, которую я получаю:

error: read-only variable is not assignable

Как переменная стала доступной только для чтения?Как это можно изменить?

Ответы [ 4 ]

1 голос
/ 04 мая 2011

Если вам действительно нужно изменить элемент в set, элемент должен быть однажды удален из set и вставлен в него set.
Например:

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

Если operator< для myClass не относится к элементу value, вы можете использовать std::map вместо set.Если предположить новый myClass, в котором нет элемента value, и предположить, что тип элемента value равен T, то std::map< newMyClass, T > будет соответствовать цели.

1 голос
/ 04 мая 2011

Вещи в наборе эффективно доступны только для чтения - вы не можете изменить значение члена множества на месте.Все, что вы можете сделать, это удалить его и добавить нового члена с требуемым новым значением.Это ограничение необходимо из-за реализации std :: set в двоичном дереве.

0 голосов
/ 04 мая 2011

в Visual Studio 2010, когда Microsoft обновила STL, они сделали все итераторы постоянными. Поэтому set :: iterator и set :: const_iterator - это одно и то же.

Причина в том, что в наборе ключом являются сами данные, и когда вы изменяете свои данные, и, следовательно, ключ, который является нет, нет.

Команда Microsoft C ++ сообщила об этом критическом изменении здесь: http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx

Если вы хотите изменить свои данные и не хотите удалять и вставлять, используйте вместо этого карту.

0 голосов
/ 04 мая 2011

Компилируется под 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 членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...