2013-11-01 3 views
0

Я до сих пор мог использовать 1-й вектор, добавляя или удаляя элементы с помощью push/pop back. Однако при попытке заполнить 2-й вектор, который должен представлять матрицу, я сталкиваюсь с проблемами. Я не смог использовать эти функции с моим 2-d вектором. Когда код компилируется и запускается, я получаю бит, запрашивающий измерение, а затем запрашивает первый элемент [1,1], для любого введенного значения получается «Ошибка сегментации: сбрасывание ядра». Я понятия не имею, что происходит, и пытался изменить биты моего кода, но не имел большого успеха, интернет также был бесполезен в предоставлении простого руководства о том, как заполнить эти проклятые вещи ... Спасибо так много!Как добавить элементы в двумерный динамический вектор

Вот мой код

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

vector<vector<double> > readMatrix(); 

int main() 
{ 
    vector<vector<double> > matrix1 = readMatrix(); 

    vector<vector<double> > matrix2 = readMatrix(); 

} 

vector<vector<double> > readMatrix() 
{ 
    cout << "Entering a matrix" << endl; 
    cout << "Number of Lines : "; 
    int numberOfLines; 
    cin >> numberOfLines; 
    cout << "Number of Columns :"; 
    int numberOfColumns; 
    cin >> numberOfColumns; 
    vector<vector<double> > matrix; 
    int i(0); 
    int j(0); 

    while(i<=numberOfLines && j<=numberOfColumns) 
    { 
     cout << "[" << i+1 << "," << j+1 << "] =" ; 
     int value; 
     cin >> value; 
     matrix[i].push_back(value); 
     cout << endl ; 
     j++; 
     if(j==numberOfColumns) 
     { 
      j=1; 
      i++; 
     } 
    } 

    return matrix; 
} 
+1

Должно быть, у вас нет s.th. как 'matrix [i] [j] = value;' –

+0

@ g-makulik, который работал бы, если бы это была трехмерная матрица, вопрос касается 2D-матрицы. –

+1

Вектор векторов - это просто вектор. Так что заполните его, как если бы вы сделали 1D-вектор. За исключением положительных векторов в нем. – juanchopanza

ответ

0

Объявить матрицу следующим образом:

vector<vector<double> > matrix (y, vector<double> (x, 0)); 

Теперь у вас есть у * х матрицы. Если вы хотите использовать push_back, вам нужно объявить x-вектор при запуске в новой строке.

0

Когда вы vector<vector<double> > matrix; инициализация вектора векторов, причем оба размера 0 (это значение по умолчанию), так что, когда вы делаете matrix[i].push_back(value) даже когда i==0 доступ памяти, которые вы не выделены. это лучше, если вы предварительно выделить память, как это:

vector<vector<double> > matrix(numberOfLines,vector<double>(numberOfColumns)); И тогда вам не нужно отодвигать или что-нибудь, вы просто делаете matrix[i][j]=whatever.

0

В C++ вы можете использовать векторный конструктор для автоматического определения размера:
vector<vector<double> > matrix(numberOfLines, vector<double>(numberOfColumns, 0));
с векторами, для петель лучше, чем в то время как петли, так как размер всегда известен. Я предлагаю вам перебрать вектор строк и столбцов с этим

0

вам нужно сделать что-то вроде (и удалить ваши заявления push_back.):

matrix.resize(...); 
. 
. 
. 
matrix[i].push_back(...); 

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

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