替换地图元素的值不起作用
Replacing the value of map elements isnt working
我刚刚了解 std::map
及其功能。我最近遇到了这个问题。我尝试制作一个程序,打印出我使用 std::map
作为 keys 和 values 的网格类型数据。该程序打印出来很好,但我想制作一个程序,一旦我删除了该网格中的一个数据,其他上面的数据应该向下移动一个步骤,最上面的数据将是 0。我以某种方式尝试过,但似乎没有用。我不知道我哪里做错了。我的代码:
- 在 class header:
#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);
};
- 在 class 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;
}
没有任何输入的输出:
在输入中输入数字 191 后:
预期结果:
除了印刷没问题。我不知道我做错了什么。任何帮助,将不胜感激。提前致谢!!
您有以下内容:
x_Pair MapCheck::GetBlockCell(int num)
用作
x_Pair pair = GetBlockCell(cell);
这将调用 std::pair<> 的复制构造函数。
我认为你需要 return 并使用参考:
x_Pair& MapCheck::GetBlockCell(int num)
用作
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;
}
是找到底部的元素。当您想将移除的项目上方的所有内容都移到一个槽位时,这并不是那么有用。那么让我们翻转一下。
for (int i = pair.second; i > 0; i--)
{
m_MapData[{pair.first, i}] = m_MapData[{pair.first, i - 1}];
}
m_MapData[{pair.first, 0}] = 0;
这从要删除的项目开始,一直到插槽 1,将每个项目向下复制一个插槽。要处理列的顶部,我们需要 m_MapData[{pair.first, 0}] = 0;
将顶部项目设置为零,我们只需要做一次。
旁注:除非我们有稀疏数组,否则用二维数组代替 map
会更有效。
我刚刚了解 std::map
及其功能。我最近遇到了这个问题。我尝试制作一个程序,打印出我使用 std::map
作为 keys 和 values 的网格类型数据。该程序打印出来很好,但我想制作一个程序,一旦我删除了该网格中的一个数据,其他上面的数据应该向下移动一个步骤,最上面的数据将是 0。我以某种方式尝试过,但似乎没有用。我不知道我哪里做错了。我的代码:
- 在 class header:
#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);
};
- 在 class 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;
}
没有任何输入的输出:
在输入中输入数字 191 后:
预期结果:
除了印刷没问题。我不知道我做错了什么。任何帮助,将不胜感激。提前致谢!!
您有以下内容:
x_Pair MapCheck::GetBlockCell(int num)
用作
x_Pair pair = GetBlockCell(cell);
这将调用 std::pair<> 的复制构造函数。
我认为你需要 return 并使用参考:
x_Pair& MapCheck::GetBlockCell(int num)
用作
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;
}
是找到底部的元素。当您想将移除的项目上方的所有内容都移到一个槽位时,这并不是那么有用。那么让我们翻转一下。
for (int i = pair.second; i > 0; i--)
{
m_MapData[{pair.first, i}] = m_MapData[{pair.first, i - 1}];
}
m_MapData[{pair.first, 0}] = 0;
这从要删除的项目开始,一直到插槽 1,将每个项目向下复制一个插槽。要处理列的顶部,我们需要 m_MapData[{pair.first, 0}] = 0;
将顶部项目设置为零,我们只需要做一次。
旁注:除非我们有稀疏数组,否则用二维数组代替 map
会更有效。