我想从地图中删除一个键值对但我的问题是我有值而不是键。 如何使用“值”从地图中删除键值对。 我拥有的价值在地图中是独一无二的。
我的代码段:
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 ;
}
这会删除键值对吗?
答案 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;
}
这遵循更一般的模式,适用于 有条件地从任何容器中删除元素。