如何在C++中创建一个链表向量

How do you create a vector of linked lists in C++?

本文关键字:一个 链表 向量 C++ 创建      更新时间:2023-10-16

我声明了链表的向量(链表包含int值)。然后我尝试将一个值推到链表上(i只是矢量中的一个位置):

vector< list<int> > linkedListVector;
adjacencyVector[i].push_back(s);

问题是,当我运行上面的命令时,我遇到了一个分段错误,我不知道为什么。我查阅了C++文档,我的格式看起来是正确的。有什么想法吗?

您必须将list<int>的实例添加到vector中,然后才能通过索引访问特定的list<int>,然后才能在list<int>上调用push_back()。所以要么push_back()要么list<int>变成向量:

vector< list<int> > adjacencyVector;
list<int> l;
adjacencyVector.push_back(l);
...
adjacencyVector[0].push_back(s);

或者调用矢量的resize()方法一次添加多个列表:

vector< list<int> > adjacencyVector;
adjacencyVector.resize(number of lists);
...
adjacencyVector[index].push_back(s);

矢量从零开始,在[i]处推到列表之前必须创建矢量元素。

如果你的i以正常的方式进行,你可以先将push_back()放到向量上,然后放到向量中的列表上。如果没有,你可以添加一些丑陋的东西,比如:

if ( adjacencyVector.size() <= i ) { adjacencyVector.resize(i + 1) ; }
adjacencyVector[i].push_back(s);

如果您正在使用for循环,那么您可能已经知道最大大小,因此您可以使用resize方法,如下所示:

adjacencyVector.resize(MAXSIZE)

然后我尝试将一个值推送到链表中。

您试图访问一个不存在的对象。邻接向量[i]列表不存在,因为如果你没有将元素放入其中,邻接向量是一个空向量。

下面的例子将使一些细节变得清晰。

#include <iostream>
#include <vector>
#include <list>
int main()
{
    std::vector<std::list<int> > v; // This statement creates an empty vector of lists of integers.
    std::list<int> l; // This statement creates an empty list of integers.
    for(int i=0; i<10; ++i){
        l.push_back(i);
        v.push_back(l);
    }
    for(unsigned int i=0; i<v.size(); ++i){ // You can access elements calling the operator[].
        for(std::list<int>::iterator it=v[i].begin(); it!=v[i].end(); ++it){
            std::cout<<*it<<' '; // You can access elements calling the operator[] , you need an iterator.
        }
        std::cout<<std::endl;
    }
    //std::cout<<*(v[v.size()].begin())<<std::endl; // It causes segmentation fault, because v[10] does not exist,
                                                  // 10 is out of range of valid indexes.
}

矢量和列表非常相似。若使用list,则插入和删除更有效,但若使用vector,则访问元素通常更有效。