2015-12-01 4 views
1

Я объявил вектор связанного списка (и связанные списки содержат значения int). Затем я попытался оттолкнуть значение на связанный список (i это просто позиция в векторе):Как создать вектор связанных списков в C++?

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

Проблема заключается в том, что я бегу в сбоем сегментации, когда я запускаю выше команду, и я не знаю, почему. Я просмотрел документацию на C++, и мое форматирование выглядит правильно. Есть идеи?

+4

Какой размер? Это, по крайней мере, i + 1? – immibis

ответ

0

Если вы используете цикл, то вы, вероятно, уже знаете, что размер макс будет, так что вы можете просто использовать resize метод, как это:

adjacencyVector.resize(MAXSIZE) 
2

Вектор начинается с нуля, и вы должны создать векторный элемент, прежде чем нажимать на список по адресу [i].

Если ваш i прогрессирует в обычном режиме, вы можете push_back() на первый век, а затем на список в векторе. Если нет, вы можете добавить что-то немного некрасиво, такие как:

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

Можете ли вы рассказать о том, как я буду это делать? Мой вектор не имеет фиксированного размера, и я использую цикл для ввода правильных значений. –

+0

Или вы можете «изменить размер» или «зарезервировать». – erip

+0

@erip: 'reserve()' не будет создавать фактические объекты 'list', но' resize() 'будет. –

1

Вы должны добавить экземпляр list<int> к vector, прежде чем вы можете получить доступ к определенному list<int> по индексу, то вы можете позвонить push_back() на list<int>. Так как 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); 
0

Затем я попытался вывести значение в связанный список.

Вы пытались получить доступ к объекту, которого не было. Список adjacencyVector [i] не существует как смежность. Vector - пустой вектор, если вы не поместили в него элемент.

В следующем примере будут разъяснены некоторые детали.

#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. 
} 

Векторы и списки аналогичны. Вставка и удаление более эффективны, если вы используете список, но доступ к элементу обычно более эффективен, если вы используете вектор.

Смежные вопросы