c++ - 在 while 循环内的变量中分配新内存

标签 c++ pointers memory-management queue artificial-intelligence

我有一个 Town 类,它代表我图中的节点,如下所示:

class Town
{
public:
    Town();
public:
    Town* _parent;

    int _name;
    int _row;
    int _column;
    State _state;

    vector<Town*> _neighbors;
};

我有一个 Map 类,它包含城镇的二维 vector ,几乎可以构成我的随机图。

class Map
{
public:
    Map(const int elements, const int size, const int seed);
public: 
    vector <vector<Town> > _map;
    vector <Town*> _towns;
    vector <vector<int> > _adjacency;
    vector <vector<double> > _mDistance;
    vector <Line> _edges;

    const int _elements;
    const int _size;

    Town* _start;
    Town* _exit;
};

然后我的 AI 类接收一个 Map 对象并根据算法解决它,现在我正在实现 Astar。

class AI
{
private:
    struct TownWithCost
    {
        Town town;
        double cost;
    };

    struct OrderByTotalCost
    {
        bool operator()(TownWithCost lfs, TownWithCost rhs)
        {
            return lfs.cost > rhs.cost;
        }
    };
public:
    AI(Map map);
private:
    bool AStar(Town* town);

    double GetTotalCost(Town town);

public:
    bool _success;
private:
    Map _map;
};

这是我的 Astar 实现:

bool AI::AStar(Town* town)
{
    AI::OrderByTotalCost comparator;
    vector<TownWithCost> priorityQueue;

    TownWithCost currentTown = { *town, 0 };
    Town temp = currentTown.town;

    priorityQueue.push_back(currentTown);

    SetEnvironment(temp, State::visited);

    while (!priorityQueue.empty())
    {
        currentTown = priorityQueue.front();
        Town temp = currentTown.town;

        priorityQueue.erase(priorityQueue.begin());

        SetEnvironment(temp, State::visited);
        PrintEnvironment();

        if (temp._name == _map._exit->_name)
        {
            return true;
        }

        vector <Town*> neighbors = town->_neighbors;

        for each (Town* neighbor in neighbors)
        {
            Town tempNeighbor = *neighbor;

            if (tempNeighbor._state == State::town)
            {
                tempNeighbor._parent = &temp;
                TownWithCost neighborWithCost = { tempNeighbor, GetTotalCost(tempNeighbor) };

                priorityQueue.push_back(neighborWithCost);
            }
        }
        make_heap(priorityQueue.begin(), priorityQueue.end(), comparator);
    }
    return false;
}

正如您可能注意到的那样,我还没有实现查看 priorityQueue 以查看我是否已经在其中有一个 Town 并比较成本以查看哪个我想保留一个,但我计划在解决当前问题后实现它。

我的问题是,我不想在 priorityQueue 中有指针。我正在尝试制作将复制一个城镇的临时变量,它的成本来自某条路径。

假设我从 9 镇开始。

9 有邻居 0783 特别是priorityQueue 在第一个循环中看起来像这样:

Parent 9

然后我得到 3 作为我的 currentTown,我正在检查它的邻居。

当我第二次到达 Town temp = currentTown.town; 行时,priorityQueue 中每个元素的父元素都被设置为 3 。现在我明白了为什么会这样,但我不明白的是如何防止这种情况发生。

Parent  changed to 3

我基本上需要的是 priorityQueue 来存储具有不同 parent 和不同成本的相同城镇(不同的内存地址)(我已经用结构 TownWithCost 处理了单独的成本)。所以总而言之,每次都要复印。

例如,我可以从 9 直接到达 0,总成本为 81,但我也可以通过 3 到达 0 (9 -> 3 -> 0),总成本为 50。我希望能够区分这两者。

我如何在我的 priorityQueue 中区分它们以及如何避免重置父级,或者换句话说,我如何将另一部分内存分配给 Town temp每次循环运行时,我每次都可以有不同的温度?

如果您有其他方法(尽可能对新手友好),请随时说出来。

最佳答案

您正在传递 Map 的值实例,并且此类没有复制构造函数或赋值运算符。当此类被浅拷贝(ala memcpy)时,vector 实例在被销毁(多次)时会导致崩溃。

尝试使用指针或引用。也会工作得更快。

关于c++ - 在 while 循环内的变量中分配新内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20619849/

相关文章:

c++ - 拖动 View 时 QGraphicsItem 消失

c++ - 在 C++ 中传递参数的问题(指针让我困惑)

c - MSVS 2017 : Pointer null check not behaving as it should

java - Selenium 使用太多内存

c++ - 为什么我的程序在恰好循环 8192 个元素时很慢?

c++ - 解析日期字符串以从时间戳中删除小时、分钟和秒

c++ - 如何使用 typedef 简化作为函数指针的模板函数参数

C指针总是包含它自己的内存地址?

c - 如何从编译器获取变量的指针和大小——从编译代码之外?

c - 需要一些帮助来理解 C 中的指针和内存