如何从地图中的集合中删除元素?

时间:2015-08-31 16:09:05

标签: c++ dictionary set

我无法从名为set的{​​{1}}中的map内删除元素。地图的键不同accesrightsByRank s:ACCESRIGHTownermodifyreadnone的值为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>>>

2 个答案:

答案 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)

总结所有评论,

  1. 您正在修改地图和集合。因此,您应该使用iterator,而不是const_iterator
  2. 要删除集合中的某些值,您不需要线性搜索。 std::set::erase()有一个变量,可以删除值。
  3. i->second(*i).second等同且易于阅读。
  4. this->是多余的,除非您有一个同名的局部变量。
  5. 结合它们,你会得到

    map<ACCESSRIGHT, set<string>>::iterator i;
    
    for(i = accessrightsByRank.begin(); i != accessrightsByRank.end(); i++){
        i->second.erase(p_Username);
    }