使用map.erase后,map/set不可延迟
map/set no deferenceable after using map.erase
我的代码中出现了一个map/set不可撤消的调试断言错误,我不知道如何修复它,我已经将问题定位到了map.erase中。在我的Shape::insert函数中,我不不知道如何阻止问题的发生。感谢
如果我删除擦除功能,它可以工作,但我需要它从地图上擦除项目,这样它们就不会再被那些功能使用
ShapeDraw.h
#ifndef _SHAPE_
#define _SHAPE_
#include <Windows.h>
#include <cmath>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <algorithm>
#include <cstdlib>
#include <time.h>
#include <fstream>
#include <commdlg.h>
struct CardData
{
int _x;
int _y;
LPCWSTR _filename;
int _value;
int _suit = 0; //0 - Hearts, 1 - Diamonds, 2 - Spaces, 3 - Clubs
bool _face = 0; //0 - Face Down, 1 - Face Up <-- This bit is only used for adding the cards to the stacks and shit
};
struct cardStackList;
class Shape
{
public:
cardStackList *stack[11];
//extern cardStackList *stack[11];
//static HBITMAP mBkg;
int g_width = 10; //Default Pen Size is 10,
int g_pen = PS_SOLID;
int pCountMax = pCount;
int pCount = 0; //Painting Count
std::map<int, CardData> _cardMatrix;
std::map<int, CardData>::iterator _rCardIter;
cardStackList* make_stack();
void insert(cardStackList *_stack);
void CreateStacks();
cardStackList* remove(cardStackList *_stack); //Remove the top most card
cardStackList* search(cardStackList *_stack, int _value, int _suit);
void display(cardStackList *_stack); //Draw Cards in descending order
Shape()
{
for (int i = 0; i < 11; i++)
{
stack[i] = NULL;
}
}
};
#endif
ShapeDraw.cpp
#include "ShapeDraw.h"
struct cardStackList
{
int _x;
int _y;
LPCWSTR _filename;
int _value;
int _suit;
struct cardStackList *next;
struct cardStackList *prev;
bool _face; //0 - Face Down, 1 - Face Up
}*stack[11];
cardStackList* Shape::make_stack()
{
int i;
struct cardStackList *temp;
temp = new(struct cardStackList);
if (temp == NULL)
{
return 0;
}
else
{
i = rand() % (_cardMatrix.size());
_rCardIter = _cardMatrix.find(i);
temp->_x = _rCardIter->second._x;
temp->_y = _rCardIter->second._y;
temp->_filename = _rCardIter->second._filename;
temp->_value = _rCardIter->second._value;
temp->_suit = _rCardIter->second._suit;
temp->_face = _rCardIter->second._face;
temp->next = NULL;
temp->prev = NULL;
_cardMatrix.erase(_rCardIter);
pCount--;
pCountMax = _cardMatrix.size() + 1;
}
return temp;
}
void Shape::insert(cardStackList *_stack)
{
struct cardStackList *temp, *s, *t;
temp = make_stack();
s = _stack;
t = s;
if (_stack == NULL)
{
_stack = temp;
_stack->next = NULL;
_stack->prev = NULL;
}
else
{
while (s != NULL)
{
t = s;
s = s->next;
}
s = temp;
s->prev = t;
s->prev->next = s;
}
}
cardStackList *Shape::remove(cardStackList *_stack)
{
struct cardStackList *temp, *t, *return_card;
temp = _stack;
t = temp;
while (temp != NULL)
{
t = temp;
if (temp->next != NULL)
{
temp = temp->next;
}
else
{
temp = t;
}
}
temp = t;
return_card = temp->next;
temp->next = temp->next->next;
temp->next->prev = t;
return return_card;
}
cardStackList *Shape::search(cardStackList *_stack, int _value, int _suit)
{
struct cardStackList *temp;
temp = _stack;
while (temp->_value != _value && temp->_suit != _suit)
{
if (temp->next != NULL)
{
temp = temp->next;
}
}
if (temp != NULL)
{
return temp;
}
return NULL; //Only reaches this if the _value and _suit does not exist in that specific stack
}
void Shape::display(cardStackList *_stack)
{
struct cardStackList *_slot[11];
/*
slots 7 to 10 are the Ace Slots
*/
for (int i = 0; i <= 10; i++)
{
_slot[i] = stack[i];
}
for (int i = 0; i <= 10; i++)
{
while (_slot[i] != NULL)
{
}
}
}
void Shape::CreateStacks()
{
for (int i = 0; i < 7; i++)
{
insert(stack[0]);
}
for (int i = 0; i < 6; i++)
{
insert(stack[1]);
}
for (int i = 0; i < 5; i++)
{
insert(stack[2]);
}
for (int i = 0; i < 4; i++)
{
insert(stack[3]);
}
for (int i = 0; i < 3; i++)
{
insert(stack[4]);
}
for (int i = 0; i < 2; i++)
{
insert(stack[5]);
}
for (int i = 0; i < 1; i++)
{
insert(stack[6]);
}
//Stuff that creates the 7 stacks here
}
问题出在这一行:
_rCardIter = _cardMatrix.find(i);
_cardMatrix
是映射,但i
是映射中元素的索引(计数)。find最终将无法找到具有第i个索引的卡,并返回end
迭代器。
举个例子,我假设你的矩阵以卡号0..51开始。移除的第一张牌是第23张牌,因此矩阵有51张牌0..22和24..51。下一次,你再次想要第23张卡。find
找不到,因为那张卡已经被删除了,你将得到的迭代器将是_cardMatrix.end()
,它不能被取消引用。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何仅为一个函数添加延迟
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 以在Qt中的IF语句中设置时间延迟
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 模板化类中静态成员的延迟初始化
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 将自定义函数传递到基抽象类中以延迟执行
- 使用字符数组作为 Map 中的键
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 使用map.erase后,map/set不可延迟