从多重地图中删除"value"
Deleting a "value" from a multimap
我的要求是从多重映射中删除"值"而不是"键"。一个键可能有多个值,i
希望删除特定值。我的要求类似于从链表中删除节点。
我正在使用multimap::erase()
方法这样做。但是删除后,如果我尝试打印多重地图的值,则也会打印使用multimap::erase()
删除的值。
下面是我的代码片段:
void Clientqueues::clearSubscription(string name,string sessionid)
{
pair<multimap<string,string>::iterator,multimap<string,string>::iterator> i;
multimap<string, string>::iterator j;
i = registeredClientInfo.equal_range(name);
if (j == registeredClientInfo.end())
return;
for(j=i.first;j != i.second;++j)
{
if((j->second) == sessionid) registeredClientInfo.erase(j->second);
}
for(j=i.first;j != i.second;++j)
{
cout<<""<<j->second<<endl;///This prints the erased values too;
}
}
我做错了什么吗?非常感谢这方面的任何帮助。
最重要的是,当你打算称呼erase(j)
时,你称呼erase(j->second)
。您不会擦除 j
指向的多重映射元素,而是擦除键等于 j
指向的元素值的所有元素(即 sessionid
(。我希望这没什么。
另外:在erase
循环完成后再次调用equal_range
- 使用擦除迭代器的效果是不确定的,所以如果你i.first
擦除了第一个迭代器,那么你之后就不能再从那里开始迭代了。
请注意,这也意味着您的循环中存在一个执行erase
的错误,因为在您确实调用erase
的情况下,当它包含不再有效的迭代器值时,您会递增j
。不幸的是,正确的代码是:
for(j=i.first;j != i.second;)
{
if((j->second) == sessionid) {
auto next = j;
++next;
registeredClientInfo.erase(j);
j = next;
} else {
++j;
}
}
或者,如果您愿意:
for(j=i.first;j != i.second;)
{
auto current = j;
++j;
if((current->second) == sessionid) registeredClientInfo.erase(current);
}
或者,如果该条目对于键/值对是唯一的,因此您最多只需要删除一件事,那么:
for(j=i.first;j != i.second;++j)
{
if((j->second) == sessionid) {
registeredClientInfo.erase(j);
break;
}
}
if (j == registeredClientInfo.end()) return;
也不对,因为当您这样做时j
未初始化。如果未找到键,则equal_range
返回一个空范围(两个相等的迭代器值(,因此其他循环无论如何都不会执行任何操作。
如果您
删除了i.first
或i.second
则迭代器将失效,这意味着未定义的行为。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 从多重地图中删除"value"
- 使用value从映射中删除键值对
- 错误是什么意思"void-value is not ignored"以及如何删除它?
- <Value> 使用指向值的原始指针从 std::list 中删除?