使用值从地图中删除键值对

时间:2011-12-06 13:41:19

标签: c++ map

我想从地图中删除一个键值对但我的问题是我有值而不是键。 如何使用“值”从地图中删除键值对。 我拥有的价值在地图中是独一无二的。

我的代码段:

int Clientqueues::addClient(string ipaddress, string sessionid)
{
    clientsWithNoLogin.insert(pair<string,string>(ipaddress,sessionid));
    return 0;
}

void Clientqueues::deleteClient(string sessionid)
{
    map<string, string>::iterator i,current;

   for(i = clientsWithNoLogin.begin() ;i!= clientsWithNoLogin.end();)
   {
    current = i;
    ++i;
    if((current->second) == sessionid) clientsWithNoLogin.erase(current);
   }
   return ;
}

这会删除键值对吗?

2 个答案:

答案 0 :(得分:2)

是的,这应该有效。但由于该值是唯一的,因此您无需完成迭代。

void Clientqueues::deleteClient(string sessionid)
{
    for (map<string, string>::iterator i(clientsWithNoLogin.begin());
         i != clientsWithNoLogin.end(); ++i)
        if (i->second == sessionid) {
            clientsWithNoLogin.erase(i);
            break;
        }
}

这仍然需要O( n )预期时间,但是只有一半的常数。

答案 1 :(得分:1)

是。一个更惯用的解决方案是使用返回值 erase在匹配时更新迭代器:

std::map<std::string, std::string>::iterator current
        = clientsWithNoLogin.begin();
while ( current != clientsWithNoLogin.end() ) {
    if ( current->second == sessionId ) {
        current = clientsWithNoLogin.erase( current );
    else
        ++ current;
}

这遵循更一般的模式,适用于 有条件地从任何容器中删除元素。