yuAriellexi 2019-08-12 11:26 采纳率: 100%
浏览 2445
已采纳

c++ map里使用结构体指针作为value

编译时错误

hpp文件:
https://paste.ubuntu.com/p/xBZB8K6s3m/

cpp
https://paste.ubuntu.com/p/WYpRgjTFf2/

不采纳复制粘贴网络链接,答案

#include "messageBox.hpp"
#include <iostream>
//#include <string>
#include <map>
using namespace std;



messageBox::messageBox()
{
    waitNum = 1;
}

void messageBox::receive(int num)
{
    Node* cur = new Node(num);
    headmap.insert(num, cur);
    tailmap.insert(num, cur);

//找到上一个尾节点
    if(tailmap.find(num-1) != tailmap.end())
    {
        tailmap.at(num-1) -> next = cur;
        tailmap.erase(num-1);
        headmap.at(num-1)->next = cur;
        headmap.erase(num);
    }
//找到下一个头节点
    if(headmap.find(num+1) != headmap.end())
    {
        cur -> next = headmap.at(num+1);
        headmap.erase(num+1);
        cur -> next = tailmap.at(num+1);
        tailmap.erase(num+1);
    }
    if(waitNum == num)
    {
        print();
    }
}

void print()
{
    struct Node* tempnode = headmap.at(waitNum);
    headmap.erase(waitNum);
    while(tempnode != NULL)
    {
        cout << tempnode -> index << endl;
        tempnode = tempnode -> next;
        waitNum++;
    }
    tailmap.erase(--waitNum);
}

int main()
{
    messageBox msnbox;
    msnbox.receive(2);
    msnbox.receive(1);
    msnbox.receive(4);
    msnbox.receive(5);
    msnbox.receive(7);
    msnbox.receive(8);
    msnbox.receive(6);
    msnbox.receive(3);
    msnbox.receive(9);
    msnbox.receive(10);
    msnbox.receive(12);
    msnbox.receive(13);
    msnbox.receive(11);
}

#ifndef MESSAGEBOX_HPP
#define MESSAGEBOX_HPP
#include <map>
//#include <string>
using namespace std;



struct Node
{
    int index;
    Node* next;
    Node(int i)
    {
        index = i;
        next = NULL;
    }
};


class messageBox
{
private:
    map<int, Node*> headmap;
    map<int, Node*> tailmap;
    int waitNum;

public:
    messageBox();
    void receive(int num);
    void print();
};
#endif


  • 写回答

2条回答 默认 最新

  • qtchen_1988 2019-08-12 12:10
    关注
    两个地方导致编译不过的。
    1.
    headmap.insert(num, cur);
    tailmap.insert(num, cur);
        --->
    headmap.insert(std::pair<int,Node *>(num,cur));
    tailmap.insert(std::pair<int,Node *>(num,cur));
    
    2.
    void print()
        --->
    void messageBox::print()
    
    虽然编译过了,但你的代码;
    
        if(tailmap.find(num-1) != tailmap.end())
        {
            tailmap.at(num-1) -> next = cur;
            tailmap.erase(num-1);
            headmap.at(num-1)->next = cur;
            headmap.erase(num);
        }
            运行时会导致越界,程序崩溃,你检查一下
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 爬取豆瓣电影相关处理
  • ¥15 手机淘宝抓清除消息接口
  • ¥15 C#无selenium
  • ¥15 LD衰减计算的结果过大
  • ¥15 用机器学习方法帮助保险公司预测哪些是欺诈行为
  • ¥15 计算300m以内的LD衰减
  • ¥15 数据爬取,python
  • ¥15 怎么看 cst中一个面的功率分布图,请说明详细步骤。类似下图
  • ¥15 为什么我的pycharm无法用pyqt6的QtWebEngine
  • ¥15 FOR循环语句显示查询超过300S错误怎么办