Как удалить элемент из набора в карте?

Обновить

November 2018

Просмотры

356 раз

4

У меня есть проблемы с удалением элемента из в setпределах mapназывается accesrightsByRank. Ключи карты разные ACCESRIGHTs: owner, modify, readи none. Значения свойств mapявляются sets с именами аксессоров с определенными ACCESRIGHTс.

    map<ACCESSRIGHT, set<string>>::const_iterator i;
    set<string>::const_iterator j;

    for(i = this->accessrightsByRank.begin(); i != this->accessrightsByRank.end(); i++){
        for(j = (*i).second.begin(); j != (*i).second.end(); j++){
            if( (*j).compare(p_Username) == 0){
                i->second.erase(j);
            }
        }
    }

Я думал , что i->secondбы дать мне , setиз которых я мог бы стереть имя пользователя , который больше не имеет определенное ACCESRIGHT, но, кажется , я сделал что - то неправильно. Может кто - нибудь объяснить мне , почему это не работает , и как я должен настроить свой код?

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

IntelliSense: нет экземпляра перегруженной функции « std::set<_Kty, _Pr, _Alloc>::erase_Kty=std::string, _Pr=std::less<std::string>, _Alloc=std::allocator<std::string>]» соответствует списку аргументов и объект (объект имеет типа классификаторов , которые предотвращают совпадение) типов аргументов являются: ( std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::string>>>) тип объекта:const std::set<std::string, std::less<std::string>, std::allocator<std::string>>

2 ответы

3

Суммируя все комментарии,

  1. Вы изменяете карту и набор. Таким образом , вы должны использовать iterator, не const_iterator.
  2. Чтобы удалить какое - то значение в наборе, вам не нужен линейный поиск. std::set::erase()есть вариант , который принимает значение , которое будет удалено.
  3. i->secondэквивалентно и проще, чем читать (*i).second.
  4. this-> является излишним, за исключением, если у вас есть локальная переменная с тем же именем.

Объединить их, вы получите

map<ACCESSRIGHT, set<string>>::iterator i;

for(i = accessrightsByRank.begin(); i != accessrightsByRank.end(); i++){
    i->second.erase(p_Username);
}
3

Как указано Петр Скотницкого в своем комментарии , вы используете const_iterator. Само имя указывает на то, что такой итератор не позволяет изменять вещь это , указывая на. Измените эти строки:

map<ACCESSRIGHT, set<string>>::const_iterator i;
set<string>::const_iterator j;

к этому:

map<ACCESSRIGHT, set<string>>::iterator i;
set<string>::iterator j;

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