2017-02-04 15 views
2

Я пытаюсь создать двухмерный вектор для представления квадратной матрицы для задания домашней работы. Несмотря на то, что программа успешно компилируется, когда я пытаюсь ее запустить, программа выходит из строя и возврат не возвращается.Сбой программы при попытке создать и получить доступ к 2-му вектору

Может кто-нибудь объяснить мою ошибку мне?

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector < vector<int> > a; 
    a[0][0] = 0; 
    a[0][1] = 1; 
    cout<<a[0][0]<<a[0][1]; 
    cout<<a.size(); 
} 
+0

Можете ли вы добавить ошибку, которую задаете на свой вопрос, пожалуйста? –

ответ

0

Проблема заключается в том, что при использовании вектора вам необходимо назначить память для количества элементов, которые вы хотите сохранить. (Ну, используя массивы тоже, но это неявно при создании одного статически). Вы просто не можете идти вперед и говорить, что хотите сохранить что-то в коробке, когда нет окна.

Существует два способа создать пространство для этих элементов. Один использует конструктор, как в:

std::vector<int> myVector(100); // This makes room for a 100 elements 

И использование функции для этой цели.

std::vector<int> myVector; 
myVector.reserve(100); // This makes room for a 100 elements after the declaration 

Так что оттуда, я думаю, вы можете понять, что будет дальше. Вам просто нужно освободить место для всего.

Я лично не использую Vector так сильно, потому что мне никогда не требовалось (чтобы мои собственные динамические списки в школе и в основном использовали это как мою библиотеку «Вектор»), но я определенно должен использовать его, когда это необходимо, потому что он предлагает много преимуществ.

Как известно, я знаю, что вы используете небезопасный способ доступа к данным в вашем векторе. Небезопасно, потому что он не может бросить на вас какие-либо исключения, чтобы поймать, если происходит ограниченный доступ.

std::vector<int> myVector(10); 
myVector.at(0) = 0; // What I mean is that function, you can jut wrap it inside a try-catch to make it safer. 
myVector[0] = 0; // Instead of this, of course. 

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

2

Добавить заявление печати после объявления переменной следующим образом и запустить программу. И вы можете найти ответ самостоятельно.

int main() 
{ 
    vector < vector<int> > a; 
    cout<<a.size(); 
    a[0][0] = 0; 
    a[0][1] = 1; 
    cout<<a[0][0]<<a[0][1]; 
    cout<<a.size(); 
} 
+0

Выполнение кода и кода опроса делает тот же результат на cpp.sh !! –

+0

@ m.r226 Ну, я думаю, что вам не хватает результатов, полученных программой. Запустите программу и посмотрите результаты до ее сбоя. Имейте в виду, что это проблема домашних заданий, и мы, возможно, захотим попробовать OP, чтобы думать и учиться. Программирование можно узнать, прочитав книги и статьи, но большинство из них - серия экспериментов (например, проб и ошибок). –

0

Чтобы заполнить значения в std :: vector, я предпочитаю использовать push_back funtion вместо оператора []. Push_back увеличивает размер вектора по одному, а также при необходимости перезагружать память. Помните, что это решение хорошо, только перераспределение памяти whem не является проблемой. Резервная память перед push_back всегда предпочтительнее.