2016-11-11 3 views
0

Я получаю ошибку сегментации в следующем коде, может ли кто-нибудь объяснить. Я думаю, что это может быть связано с инициализацией, но не уверен. Я просто пытаюсь клонировать существующий стек и выполнять операцию, такую ​​как добавление записи в клон или удаление записи из существующего и клонирование ее в новый стек.C++ 2D вектор Ошибка SIGSEV

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <queue> 
#include <deque> 
#include <string> 

using namespace std; 

#define in cin 
#define out cout 

int main() 
{ 
    //ifstream in("postfix.in"); 
    //ofstream out("postfix.out"); 

    int n; 
    in>>n; 

    long sum=0; 
    vector<int> tm(0); 
    vector<vector<int>> ar(0,tm); 
    //ar[0].push_back(0); 
    out<<ar[0][0]; 
    for(int i=0;i<n;i++) 
    { 
     int ind,val; 
     in>>ind>>val; 
     if(val==0) 
     { 
      for(int j=0;j<ar[ind-1].size();j++) 
      ar[i].push_back(ar[ind-1][j]); 
      ar[i].pop_back(); 
     } 
     else 
     { 
      for(int j=0;j<ar[ind-1].size();j++) 
      ar[i].push_back(ar[ind-1][j]); 
      ar[i].push_back(val); 
     } 

    } 

    for(int i=0;i<n;i++) 
    { 
     for(int j=0;j<ar[i].size();j++) 
     sum+=ar[i][j]; 
    } 

    out<<sum<<endl; 

    return 0; 

} 
+3

Вы отлаживали его? – Carcigenicate

+0

'#define in cin #define out cout' - Пожалуйста, прекратите это делать. Это просто добавляет путаницу кому-то, читающему код - каждый программист на C++ знает, что 'cin' и' cout' не скрывают макрос '# define'. – PaulMcKenzie

+0

Я использую оператор #define, потому что я должен протестировать его на консоли, прежде чем использовать его с потоком файлов, это просто для удобства, и я просто вставил оригинальный код здесь, извините за это. – shubhamrock828

ответ

0

Думаю, я вижу, где вы сработали.

vector<int> tm(0); 

Это делает не создать вектор, содержащий 0. Это создает вектор с размером 0. Поскольку этот список имеет размер 0, вы не можете получить первый элемент; потому что он пуст!

То же самое здесь:

vector<vector<int>> ar(0,tm); 

Это не создает вектор с "строки" 1. Он создает пустой вектор, так как вы снова сделали размер 0.

Вы, вероятно, предназначен что-то вроде:

vector<int> tm(1, 0); 
vector<vector<int>> ar(1,tm); 

который создает строку, tm, с одним 0, а затем создает 2D-вектор, содержащий ar что 1 строку.

Проверьте reference. Вы пытаетесь использовать конструктор «fill».

+0

Да, я понял это ... Я неправильно понял ссылку с http://www.cplusplus.com/forum/beginner/12409/ – shubhamrock828

+0

@ shubhamrock828 Ahh. Очень рад, что вы это разработали. – Carcigenicate

+0

Спасибо @Carcigenicate, Как вы думаете, вы можете помочь мне с поиском сложностей по времени для этого вопроса: http://stackoverflow.com/questions/40578849/time-complexity-with-insertion-sort-for-2n-array – shubhamrock828

1
vector<int> tm(0); 
vector<vector<int>> ar(0,tm); 

Здесь инициализируется ar как пустой вектор вектора междунар. Без увеличения его размера до push_back(), resize(), insert() и т. Д., Вы не можете получить доступ к ar[i].

Вы можете вместо инициализации ar в

vector<vector<int>> ar(n); 

Но в существующем фрагменте кода вы предоставили нет никакого понятия о том, как велика второе измерение должно быть.

За ваш комментарий в этом ответе, ваша декларация tm и ar должны быть

vector<int> tm(1, 0); 
vector<vector<int>> ar(1, tm); 

Или еще короче, так как tm не реально используется позже,

vector<vector<int>> ar(1, vector<int>(1, 0)); 
+0

Спасибо, timaru, но я не привел вас сюда. Что значит инициализированный пустой вектор? здесь я пытаюсь инициализировать массив на 0-й индекс с tm-вектором. Вектор tm также инициализируется одним элементом, который равен «0». – shubhamrock828

0

Для начала это плохо идея использования таких определений

#define in cin 
#define out cout 

Лучше использовать явно std::cin и std::cout, потому что любой программист знает, что означают эти имена.

Эти заявления

vector<int> tm(0); 
vector<vector<int>> ar(0,tm); 

не делают большой смысл. Было бы намного проще, ясно и просто написать

vector<int> tm; 
vector<vector<int>> ar; 

SO как векторы пусты, вы не можете использовать оператор подстрочного, как вы делаете, например, здесь

out<<ar[0][0]; 
    ^^^^^^^^^ 
for(int i=0;i<n;i++) 
{ 
    int ind,val; 
    in>>ind>>val; 
    if(val==0) 
    { 
     for(int j=0;j<ar[ind-1].size();j++) 
        ^^^^^^^^^^^ 
     ar[i].push_back(ar[ind-1][j]); 
     ^^^^^ 
     ar[i].pop_back(); 
     ^^^^^ 
    } 

и так далее. Сначала вам нужно добавить новые элементы к вектору перед использованием оператора индекса.

+0

Я использую оператор #define, потому что я должен его протестировать в консоли, прежде чем использовать его с файловым потоком, это просто для удобства, и я просто вставил оригинальный код здесь, извините за это. Далее я использую: tm (0) и ar (0, tm) для цели инициализации, я не вижу, что здесь не так. и почему бы мне не получить вывод 0, когда i cout << ar [0] [0]; – shubhamrock828

+0

@ shubhamrock828 Некоторое время, так как я использовал вектор, но iirc, давая конструктору число, определяет размер, который вы хотите. Вы сказали, что хотите, чтобы размер был равным 0, поэтому нет никакого 0-го элемента вектора для получения, или, сформулированный другим способом, вы не можете получить первый элемент пустого вектора. – Carcigenicate

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