C++ 如何在一段时间内从multimap中删除多个项目?

C++ 如何在一段时间内从multimap中删除多个项目?,c++,iterator,multimap,C++,Iterator,Multimap,我使用迭代器删除项目,我想在每一步中从我的映射中删除第一个项目和第二个项目 这是代码(此代码是哈夫曼代码的一部分) std::multimap::迭代器第一,第二; first=floattnode.begin(); 第二个=++第一个; 而(floattnode.size()!=0){//floattnode是到节点的多映射映射频率 根=新节点((*first).first+(*second.first'); 根->左=新节点((*first.second),0); 根->右=新节点((*se

我使用迭代器删除项目,我想在每一步中从我的映射中删除第一个项目和第二个项目

这是代码(此代码是哈夫曼代码的一部分)

std::multimap::迭代器第一,第二;
first=floattnode.begin();
第二个=++第一个;
而(floattnode.size()!=0){//floattnode是到节点的多映射映射频率
根=新节点((*first).first+(*second.first');
根->左=新节点((*first.second),0);
根->右=新节点((*second.second),1);
floattnode.erase(第一个);
floattnode.erase(秒);//这里有个问题
first=floattnode.begin();//检查
插入(std::pair(root->freq,root));
first=floattnode.begin();
第二个=++第一个;
}
当迭代器删除第一项时,它无法访问要删除的第二项,如何删除这两项

second=++first;
在这里,您不仅将迭代器分配给第二个元素,使之成为
second
,而且在
first
中步进迭代器,因为
++
是递增运算符,递增其操作数。对于
multimap
迭代器,似乎没有加法运算符。因此,在再次分配
second
后,必须减少迭代器:

second = (++first)++;
这将首先递增
第一个
,并将其返回到
第二个
,然后再次递增。或分配给第二个,然后递增:

second = first;
second++;
或更短:

(second = first)++;
无论如何,您应该首先检查容器中是否至少有两个元素。如果没有元素,则
first==floattnode.end()
,您将尝试递增该元素,调用未定义的行为。(我的设置实际上为我提供了一个无限循环来尝试此操作,另请参见)

在每个循环回合中,您将使用
new
创建新对象,并将其指针指定给
root
,然后将指向它们的指针插入到
floattnode
,但在随后的一个循环回合中再次擦除它们。因此,在某个点上会丢失对已创建对象的所有引用。由于您也从未对它们调用
delete
,因此内存正在泄漏

由于在每次循环运行结束时将元素添加到
floattnode
floattnode.size()
在循环条件检查时永远不能为零。这是一个无限循环

root=new node((*first).first+(*second).first,'-');
如果
floattnode.size()==1
将执行此操作,并且
second
将被取消引用,尽管它指向映射的最后一个元素后面。这会导致未定义的行为

而不是
(*first).first
您应该使用
first->first
以提高可读性。(情况也是如此)

由于我在开头提到的错误,您试图删除同一迭代器两次。通常,如果容器被修改,容器的迭代器可能会变得无效,因此如果您希望确保这不会影响您的使用:

floattnode.erase(floattnode.begin());
floattnode.erase(floattnode.begin()); // Notice this is now the originally second element because the first one was erased.
但是,对于
多重映射
,似乎只有已擦除的迭代器通过调用
擦除
无效,基于以下答案:。在这种情况下,您应该可以使用原始代码

由于您只检查容器大小是否大于零,因此如果大小正好为
1
,并且您尝试删除第二个元素(即
floattnode.end()
,指向最后一个元素的后面),则会再次出现未定义的行为

与开始时的错误相同

在这里,您不仅将迭代器分配给第二个元素,使之成为
second
,而且在
first
中步进迭代器,因为
++
是递增运算符,递增其操作数。对于
multimap
迭代器,似乎没有加法运算符。因此,在再次分配
second
后,必须减少迭代器:

second = (++first)++;
这将首先递增
第一个
,并将其返回到
第二个
,然后再次递增。或分配给第二个,然后递增:

second = first;
second++;
或更短:

(second = first)++;
无论如何,您应该首先检查容器中是否至少有两个元素。如果没有元素,则
first==floattnode.end()
,您将尝试递增该元素,调用未定义的行为。(我的设置实际上为我提供了一个无限循环来尝试此操作,另请参见)

在每个循环回合中,您将使用
new
创建新对象,并将其指针指定给
root
,然后将指向它们的指针插入到
floattnode
,但在随后的一个循环回合中再次擦除它们。因此,在某个点上会丢失对已创建对象的所有引用。由于您也从未对它们调用
delete
,因此内存正在泄漏

由于在每次循环运行结束时将元素添加到
floattnode
floattnode.size()
在循环条件检查时永远不能为零。这是一个无限循环

root=new node((*first).first+(*second).first,'-');
如果
floattnode.size()==1
将执行此操作,并且
second
将被取消引用,尽管它指向映射的最后一个元素后面。这会导致未定义的行为

而不是
(*first).first
您应该使用
first->first
以提高可读性。(情况也是如此)

由于我在开头提到的错误,您试图删除同一迭代器两次。通常,如果容器被修改,容器的迭代器可能会变得无效,因此如果您希望确保这不会影响您的使用:

floattnode.erase(floattnode.begin());
floattnode.erase(floattnode.begin()); // Notice this is now the originally second element because the first one was erased.
但是,对于
多重映射
,似乎只有已擦除的迭代器通过调用
擦除
无效,基于以下答案:。在这种情况下,您应该可以使用原始代码

由于您只检查容器大小是否大于零,因此如果大小正好为
1
,并且您尝试擦除s,则会再次出现未定义的行为