我无法从名为set
的{{1}}中的map
内删除元素。地图的键不同accesrightsByRank
s:ACCESRIGHT
,owner
,modify
和read
。 none
的值为map
,其中包含具有特定set
s的访问者名称。
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
的用户名,但似乎我做错了。有人可以向我解释为什么这不起作用以及我应该如何调整我的代码?
这是我收到的错误:
智能感知:没有重载功能的实例&#34;
ACCESRIGHT
[与std::set<_Kty, _Pr, _Alloc>::erase
,_Kty=std::string
,_Pr=std::less<std::string>
]&#34;匹配参数列表和对象(该对象具有阻止匹配的类型限定符) 参数类型是:(_Alloc=std::allocator<std::string>
) 对象类型是:std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::string>>>
答案 0 :(得分:3)
如Piotr Skotnicki中的his comment所示,您使用的是const_iterator
。单独的名称表示这样的迭代器不允许更改它指向的东西。改变这些行:
map<ACCESSRIGHT, set<string>>::const_iterator i;
set<string>::const_iterator j;
到此:
map<ACCESSRIGHT, set<string>>::iterator i;
set<string>::iterator j;
获得最快的修复。但是,在此之后,请考虑问题中的评论中的所有建议。
答案 1 :(得分:3)
总结所有评论,
iterator
,而不是const_iterator
。std::set::erase()
有一个变量,可以删除值。i->second
与(*i).second
等同且易于阅读。this->
是多余的,除非您有一个同名的局部变量。结合它们,你会得到
map<ACCESSRIGHT, set<string>>::iterator i;
for(i = accessrightsByRank.begin(); i != accessrightsByRank.end(); i++){
i->second.erase(p_Username);
}