如何解决替换地图元素的值不起作用
我只是在学习 std::map
及其函数。我最近遇到了这个问题。我尝试制作一个打印出网格类型数据的程序,其中我使用 std::map
作为键和值。该程序打印得很好,但我想制作一个程序,一旦我删除了该网格中的数据,上面的其他数据应该向下移动一个步骤,并且最上面的将有 0 。不知何故,我尝试过,但似乎不起作用。我不知道我哪里做错了。我的代码:
- 在类标题中:
#pragma once
#include<iostream>
#include<string>
#include<vector>
#include<map>
#define x_Pair std::pair<unsigned int,unsigned int>
class MapCheck
{
public:
std::map<x_Pair,unsigned int>m_MapData;
void SetMapData();
x_Pair GetBlockCell(int num);
void EraseCell(int cell);
};
- 在 cpp 类中:
void MapCheck::SetMapData()
{
int count = 1;
for (int j = 0; j < 20; j++)
{
for (int i = 0; i < 10; i++)
{
m_MapData[{i,j}] = count;
count++;
}
}
}
x_Pair MapCheck::GetBlockCell(int num)
{
for (int j = 0; j < 20; j++)
{
for (int i = 0; i < 10; i++)
{
if (m_MapData[{i,j}] == num)
{
return x_Pair(i,j);
}
}
}
return x_Pair(-1,-1);
}
void MapCheck::EraseCell(int cell)
{
x_Pair pair = GetBlockCell(cell);
for (int i = pair.second; i < 20; i++)
{
m_MapData[{pair.first,i}] = m_MapData[{pair.first,i - 1}];
m_MapData[{pair.first,i - 1}] = 0;
}
}
- 并在主要:
#include"MapCheck.h"
int main()
{
MapCheck mc;
mc.SetMapData();
std::string input;
do
{
system("cls");
for (int j = 0; j < 20; j++)
{
for (int i = 0; i < 10; i++)
{
std::cout << mc.m_MapData[{i,j}] << " ";
}
std::cout << std::endl;
}
std::cout << "Enter a number to erase or E to exit";
std::cin >> input;
mc.EraseCell(std::atoi(input.c_str()));
} while (input != "E");
return 0;
}
除了打印都很好。我不明白我做错了什么。任何帮助,将不胜感激。提前致谢!!
解决方法
顺序
for (int i = pair.second; i < 20; i++)
{
m_MapData[{pair.first,i}] = m_MapData[{pair.first,i - 1}];
m_MapData[{pair.first,i - 1}] = 0;
}
是在底部找到的元素。当您想将移除的物品上方的所有内容向下移动一个插槽时,这并不是很有用。所以让我们翻转它。
for (int i = pair.second; i > 0; i--)
{
m_MapData[{pair.first,i - 1}];
}
m_MapData[{pair.first,0}] = 0;
这从被移除的项目开始,上升到插槽 1,将每个项目向下复制一个插槽。为了处理列的顶部,我们使用 m_MapData[{pair.first,0}] = 0;
将顶部项目设置为零,我们只需要做一次。
旁注:除非我们有一个稀疏数组,否则使用 2D 数组代替 map
会更有效率。
您有以下内容:
x_Pair MapCheck::GetBlockCell(int num)
用作
x_Pair pair = GetBlockCell(cell);
这将调用 std::pair 的复制构造函数。
我认为你需要返回并使用引用:
x_Pair& MapCheck::GetBlockCell(int num)
用作
x_Pair& pair = GetBlockCell(cell);
谢谢, -尼尔。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。