将结构的链接列表添加到数组会产生错误

时间:2014-06-20 17:44:19

标签: c++ arrays list stl

这是我第一次在本网站上询问某些内容,所以如果我违反任何礼节,请告诉我。

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

我创建了一个list名为" eventList"我希望在其中放入一系列名为" entry"的struct,然后我希望将几个" eventList" s放入一个名为" processList&的数组中#34;

我的问题是代码的一点

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;
}

我真的很喜欢这个资源可用,我希望我能够遵循这种方式的任何答案的逻辑。为noobishness道歉,并感谢你的期待!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果eTy!=&#34; NEW&#34;然后pid保持等于-1。

所以,

PROCESSLIST [PID] .push_front(newEntry);

将崩溃,因为下标超出边界(-1)

答案 2 :(得分:0)

尽管链接列表有多棒,但请不要使用list(或std::list而不使用&#34; using namespace std&#34;位)。使用vectorstd::vector)。

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

    无法使用list运算符([] 随机访问
  • vector
  • list是一个双重链接列表,对于小型结构,它使用的内存大约是vector的4倍
  • list即使以顺序方式访问也比矢量慢。这是因为矢量更容易缓存,因为它已本地化。
  • list在其他方面通常也比vector慢。

唯一的优势&#34;插入新元素的列表不会使迭代器失效。但是矢量索引比任何一天的迭代器更可靠,所以除非你绝对需要,否则你永远不应该使用迭代器。

push_front按相反顺序构建列表,通常应使用push_back