C++;断言失败:无法增量值初始化映射/设置迭代器 我一直在C++中做一些训练,上次我尝试在另一台计算机上运行我的代码。在那里,我构建了debug,由于断言失败,执行停止了。我正在操作容器,当我使用map时,似乎无法删除元素。removeItem()方法正在触发断言,但我不知道为什么

C++;断言失败:无法增量值初始化映射/设置迭代器 我一直在C++中做一些训练,上次我尝试在另一台计算机上运行我的代码。在那里,我构建了debug,由于断言失败,执行停止了。我正在操作容器,当我使用map时,似乎无法删除元素。removeItem()方法正在触发断言,但我不知道为什么,c++,dictionary,iterator,containers,erase,C++,Dictionary,Iterator,Containers,Erase,主要内容: intmain() { //练习4.1地图和字符串 std::list list={“鸡蛋”、“牛奶”、“糖”、“巧克力”、“面粉”}; CMapStrings映射字符串; print(); mapStrings.addItem(列表); print(); mapStrings.addItem(“咖啡”); print(); mapStrings.replaceItem(“糖”、“蜂蜜”); print(); mapStrings.removietem(“milk”);//童车 pr

主要内容:

intmain()
{
//练习4.1地图和字符串
std::list list={“鸡蛋”、“牛奶”、“糖”、“巧克力”、“面粉”};
CMapStrings映射字符串;
print();
mapStrings.addItem(列表);
print();
mapStrings.addItem(“咖啡”);
print();
mapStrings.replaceItem(“糖”、“蜂蜜”);
print();
mapStrings.removietem(“milk”);//童车
print();
标准::cout second==f_项)
{
m_shoppingList2.擦除(它->第一个);
}
}
}
void CMapStrings::replaceItem(std::string f_previousItem,std::string f_nextItem)
{
for(auto it=m_shoppingList2.begin();it!=m_shoppingList2.end();it++)
{
if(it->second==f_previousItem)
{
it->second=f_nextItem;
}
}
}
void CMapStrings::print()
{
std::cout重写此for循环

for(auto it = m_shoppingList2.begin(); it != m_shoppingList2.end(); it++)
{
    if(it->second == f_item)
    {
        m_shoppingList2.erase(it->first);
    }
}
下面的方法

for(auto it = m_shoppingList2.begin(); it != m_shoppingList2.end(); )
{
    if(it->second == f_item)
    {
        it = m_shoppingList2.erase(it);
    }
    else
    {
        ++it;
    }
}
注意这句话

std::cout << m_shoppingList2 << std::endl;
效率低下。您可以使用基于范围的for循环,例如

int i = 0;

for ( const auto &s : f_items )
{
    m_shoppingList2.insert(std::pair<int, std::string>( i++, s ) );
} 
inti=0;
用于(常数自动和s:f_项)
{
m_shoppingList2.insert(std::pair(i++,s));
} 
重写此for循环

for(auto it = m_shoppingList2.begin(); it != m_shoppingList2.end(); it++)
{
    if(it->second == f_item)
    {
        m_shoppingList2.erase(it->first);
    }
}
下面的方法

for(auto it = m_shoppingList2.begin(); it != m_shoppingList2.end(); )
{
    if(it->second == f_item)
    {
        it = m_shoppingList2.erase(it);
    }
    else
    {
        ++it;
    }
}
注意这句话

std::cout << m_shoppingList2 << std::endl;
效率低下。您可以使用基于范围的for循环,例如

int i = 0;

for ( const auto &s : f_items )
{
    m_shoppingList2.insert(std::pair<int, std::string>( i++, s ) );
} 
inti=0;
用于(常数自动和s:f_项)
{
m_shoppingList2.insert(std::pair(i++,s));
} 

这发生在代码的哪一行?如果您不知道,请使用调试工具栏上的“堆栈帧”组合框切换到您的代码。
m\u shoppingList2.擦除(它->首先)
可能是问题的原因。erase会在erase之后返回一个迭代器。相关:
std::cout是的,我还发现:谢谢莫斯科的Vlad。实际上,我想删除这个问题,因为它没有那么复杂,但是人们今晚都在发火,已经有几个答案了。为什么这个代码在Re中有效租赁模式?--您的程序没有在发布模式下工作。发布模式没有调试模式的检查,因此您的程序显示未定义的行为。您的程序可能现在工作,明天不工作,在您的计算机上工作,但在另一台计算机上中断,等等。您的程序仍然中断,无论它是否在发布模式下运行是否。这发生在代码的哪一行?如果不知道,请使用调试工具栏上的“堆栈帧”组合框切换到代码。
m\u shoppingList2.erase(它->第一个)
可能是问题的原因。erase会在erase之后返回一个迭代器。相关:
std::cout是的,我还发现:谢谢莫斯科的Vlad。实际上,我想删除这个问题,因为它没有那么复杂,但是人们今晚都在发火,已经有几个答案了。为什么这个代码在Re中有效租赁模式?--您的程序没有在发布模式下工作。发布模式没有调试模式的检查,因此您的程序显示未定义的行为。您的程序可能现在工作,明天不工作,在您的计算机上工作,但在另一台计算机上中断,等等。您的程序仍然中断,无论它是否在发布模式下运行或者不是。