我声明了链表的向量(链表包含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,则访问元素通常更有效。