std::multimap and equal_range
std::multimap and equal_range
我对std::multimap
容器有一些头痛,我想知道实现我的目标的正确方法是什么。基本上,这是我的SSCCE:
#include <iostream>
#include <map>
int main ()
{
typedef std::multimap<int, int> CollectionType;
typedef std::pair<CollectionType::iterator, CollectionType::iterator> RangeType;
CollectionType multiMap;
multiMap.insert(std::make_pair(1, 1));
multiMap.insert(std::make_pair(1, 2));
multiMap.insert(std::make_pair(2, 3));
multiMap.insert(std::make_pair(2, 4));
multiMap.insert(std::make_pair(2, 5));
multiMap.insert(std::make_pair(3, 1));
RangeType range = multiMap.equal_range(2);
for (CollectionType::iterator iterator = range.first; iterator != range.second; ++iterator)
{
if (iterator->second == 4)
{
//multiMap.erase(iterator);//ISSUE 1
}
else
{
//iterator->first = -1;//ISSUE 2
}
}
return 0;
}
正如您在上面看到的,我需要为给定的键选择一个multimap
范围,然后:
- 我需要从 范围中删除某些行
- 我需要从 范围更改其他行的键
关于1,由于"对已删除元素的引用和迭代器无效",我如何删除这些元素?我是否应该将特定的迭代器推入某个容器,并在循环结束后对其进行迭代?我看到了这个答案,但它似乎有点粗俗/丑陋/容易出错/等等…
关于2,既然"愚蠢"的方法(显然)不起作用,那么什么是实现我需要的好方法呢?一旦我解决了问题1,我就可以删除元素并在原来的位置插入新的元素,但是如果我错误地插入了一个与我刚刚删除的元素具有相同键的项目,这可能不会打乱迭代吗?…
int second = iterator->second;
localEdges.smarter_erase(iterator);
localEdges.insert(std::make_pair(-1, second));
erase
返回一个迭代器,所以将你的迭代器重置为该值,它将继续有效。
用新键重新插入,擦除原来的
http://ideone.com/0Pr6Qc:#include <iostream>
#include <map>
void printMultimap(const std::multimap<int, int>& multiMap)
{
std::cout << "MultiMap:n";
for (const auto& pair : multiMap)
{
std::cout << pair.first << ":" << pair.second << "n";
}
}
int main()
{
std::multimap<int, int> multiMap;
multiMap.insert(std::make_pair(1, 1));
multiMap.insert(std::make_pair(1, 2));
multiMap.insert(std::make_pair(2, 3));
multiMap.insert(std::make_pair(2, 4));
multiMap.insert(std::make_pair(2, 5));
multiMap.insert(std::make_pair(3, 1));
printMultimap(multiMap);
auto range = multiMap.equal_range(2);
for (auto iterator = range.first; iterator != range.second;)
{
if (iterator->second != 4)
{
multiMap.insert(std::make_pair(-1, iterator->second));
}
iterator = multiMap.erase(iterator);
}
printMultimap(multiMap);
return 0;
}
相关文章:
- 如何使用"equal to"以外的评估编写开关语句
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- 使用 range-v3 读取包含逗号分隔数据的行
- 迭代的"range-based for"召唤
- 如何解决'vector subscript out of range'错误?
- 如何检查 range:: 算法(如 find_if)是否返回了值?
- C++有"not equal compare and exchange"或"fetch add on not equal"吗?
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- "[ptr, ptr+len) must be a valid range"是什么意思?
- c++ 中的 range-for 会调用项的复制构造函数吗?
- 如何创建一个版本的 boost::range::transform,该版本具有用于捕获上下文的额外参数
- 如何使用 range-v3 获取集合的所有权?
- 为什么 std::equal 模板由两个类参数化?
- QList::operator[]中的断言失败<T>:QJoysticks 中的"index out of range"
- 尝试获取矩阵的正确对角线会导致"vector out of range"错误
- 叮叮当当的'range-loop-analysis'诊断是关于什么的?
- Boost Range适配器制作集合
- std::remove, std::move(range) and moved-from elements
- C++20概念中的"equal"概念