替换地图元素的值不起作用

Replacing the value of map elements isnt working

我刚刚了解 std::map 及其功能。我最近遇到了这个问题。我尝试制作一个程序,打印出我使用 std::map 作为 keys 和 values 的网格类型数据。该程序打印出来很好,但我想制作一个程序,一旦我删除了该网格中的一个数据,其他上面的数据应该向下移动一个步骤,最上面的数据将是 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);

};

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 会更有效。