【问题标题】:Adding a linked list of structs to an array produces an error将结构的链表添加到数组会产生错误
【发布时间】:2014-06-20 17:44:19
【问题描述】:

这是我第一次在这个网站上提问,所以如果我违反了任何礼仪,请告诉我。

我对链表真的很陌生,并认为使用 list 数据类型实现它们会非常简单,但似乎我正试图对它们做一些奇怪的事情。

我创建了一个名为“eventList”的list,我想将一系列名为“entry”的structs 放入其中,然后我希望将几个“eventList”放入一个名为“processList”的数组中.

我的问题是那段代码

processList[pid].push_front(newEntry);

似乎给了我一个错误。我在做什么明显有问题吗?

代码如下:

#include <iostream>
#include <fstream>
#include <list>
#include <string>
#include <array>

using namespace std;

struct entry {
    int eTime;
    string eType;
    int pid;
};

int main(){
ifstream infile;
string comm;
int num;

entry newEntry;
list<entry> eventList;
array<list<entry>, 1024> processList;


infile.open("input00.txt");

if(infile.is_open()){
    while(!infile.eof()){
        int pid = -1;
        string eTy;
        int eTi;
        infile >> eTy;
        infile >> eTi;

        if(eTy == "NEW"){
            pid++;
            cout << "DB: Process " << pid << endl;
        }
        else{
            newEntry.pid = pid;
            newEntry.eType = eTy;
            cout << "Type: " << newEntry.eType << " | ";
            newEntry.eTime = eTi;
            cout << "Time: " << newEntry.eTime << endl;
            processList[pid].push_front(newEntry);
            //processList[pid] = eventList;  <- realized that that wouldn't work fairly quickly
        }
    }
}

else {
    cout << "Sorry, that file doesn't work. :[" <<endl;
}

cout << "Original Order:" << endl;

list<entry>::iterator p = eventList.begin();

while(p != eventList.end()){
    cout << p->eType << " For " << p->eTime << "\n";    //This comes from http://www.cplusplus.com/forum/beginner/3396/
    p++;
}

//cout << "Ordered By Time:\n";

//eventList.sort(); <- commented out, because I can't get it to work. :[

system ("PAUSE");
return 0;
}

我真的很喜欢这个资源是可用的,我希望我可以遵循任何以这种方式出现的答案的逻辑。抱歉,感谢您的观看!

【问题讨论】:

  • 您好,欢迎来到本站。你得到的错误是什么?我相信您在问题中遗漏了一些信息 - 实际上,我并没有真正了解问题本身。
  • 对不起,我刚刚编辑了这个问题,更具体地说,我的程序正在退出“返回值 3221225477”,这对我来说意义不大,但我想我确实在某处看到了 segfault 这个词。我的假设是我试图将一些东西放入一个不希望任何东西进入的内存地址中。
  • 是时候启动调试器并单步执行您的代码了。
  • 我的猜测是,您第一次尝试使用 pid = -1 将条目添加到列表中,因此尝试引用数组 [-1]。但这是一个猜测。无论您使用哪种调试器,都会肯定地告诉您。
  • 你也可以fix this: while(!infile.eof())在那里。

标签: c++ arrays list stl


【解决方案1】:

您正在 while 循环内初始化 pid。所以无论你做什么,你都会引用数组[-1]。与你的调试器交谈,它会证明我是对的。

【讨论】:

    【解决方案2】:

    如果 eTy != "NEW" 则 pid 保持等于 -1。

    所以,

    processList[pid].push_front(newEntry);

    会因为下标越界(-1)而崩溃

    【讨论】:

    • 好吧,说真的,你们都很棒。非常感谢,我想我假设 pid++ 在尝试添加到列表之前会将其增加到 0。我想我会在这里更多,但现在,非常感谢大家的帮助!
    【解决方案3】:

    尽管链表非常棒,但不要使用list(或没有“using namespace std”位的std::list)。使用vector (std::vector)。

    std::list 提供与std::vector 相同的功能,除了:

    • list 不能使用 [] 运算符随机访问,例如 vector
    • list 是一个双链表,对于小型结构,它使用的内存大约是 vector 的 4 倍
    • list 即使以顺序方式访问也比向量慢。这是因为矢量更容易缓存,因为它是本地化的。
    • list 在其他方面也普遍比vector 慢。

    插入新元素不会使迭代器无效的列表的唯一“优势”。但是向量索引在任何时候都比迭代器更可靠,所以除非绝对需要,否则永远不要使用迭代器。

    push_front以相反的顺序构建列表,您通常应该使用push_back

    【讨论】:

    • 我实际上更习惯于向量,但我的教授出于某种原因非常坚持使用链表,所以我认为至少学习如何使用它们是个好主意。不过,除此之外,我绝对同意你的看法。
    • 哦,是的,我刚刚注意到输出正在倒退,感谢您的提醒!
    • 嗯,也许他所说的使用链表的意思是,你自己编写链表。使用内置链表与使用任何其他容器没有太大区别。
    猜你喜欢
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多