2015-01-05 2 views
0

Мне нужно заменить элемент в позиции (i, j), но это не сработает. Каков правильный способ замены объекта в двумерном std :: vector?Установить элемент в двух размерных std :: vector

Вот мой код:

//Call from main 



Matrix *matrixA = new Matrix(5, 5); 
matrixA->displayElements(); 
matrixA->setElement(2, 2, 40.0); 
matrixA->displayElements(); 

//Matrix class 
std::vector < std::vector <double>> container; 

void Matrix::setElement(long atRow, long atColumn, double value) 
{ 
    for (int i=0; i < this->numberOfColumns; i++) 
    { 
     std::vector<double> row = this->container.at(i); 
     for (int j = 0; j<this->numberOfRows; j++) 
     { 
      if((j==atRow) && (i == atColumn)) 
      { 
       //std::vector<double> column = this->container.at(i); 
       row.insert(row.begin()+j, value); 
       std::cout <<row.at(j); 
       //int i = 0; 
      } 
     } 

    } 
} 
+1

'container [atRow] [atColumn] = value;' – juanchopanza

+1

Хотя это не имеет прямого отношения к вопросу, вы должны рассмотреть возможность использования интеллектуального указателя ('std :: unique_ptr' или' std :: shared_ptr') для управления ' Матричный объект. – Alejandro

+0

@AlejandroLucena Зачем использовать указатель? – juanchopanza

ответ

1

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

typedef vector<vector<double>> Matrix; 
typedef vector<double>::size_type mat_size; 

void changeMat(Matrix &mat, mat_size i, mat_size j, double val){ 
    if(i<mat.size() && j<mat[i].size()){ 
     mat[i][j] = val; 
    } 
} 

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

+0

, который работал для меня, спасибо –

0

Эй Владимир Staxhilov.

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

for(int row=0...){ 
for(int col=0...){ 

    if((row==atRow) && (col == atColumn)){ 
    container[row][col] = "value"; 
    } 

} 
} 

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

THE LINK

+0

Зачем вам нужны два цикла? – juanchopanza

2

Вам не нужны никакие петли. std::vector обеспечивает доступ к элементу через operator[]. Таким образом, если ваш вектор имеет правильные размеры, вы можете установить элемент вроде этого:

void Matrix::setElement(long atRow, long atColumn, double value) 
{ 
    container[atRow][atColumn] = value; 
} 

Этот оператор не выполняет проверки границ, так что если вы называете это с неправильным индексом, вы получите неопределенное поведение. Существует также функция-член at(), которая проверяет границы и создает исключение для доступа за пределы. Вы можете использовать его таким образом:

container.at(atRow).at(atColumn) = value; 
1

Если вы хотите вставить новый элемент в позиции, заданной переменными ATROW и atColumn

, то вы можете сделать это следующим образом

if (atRow >= 0 && atRow < this->numberOfRows && 
    atColumn >= 0 && atColumn < this->numberOfColumns) 
{ 
    this->container[atRow].insert(this->container[atRow].begin() + atColumn, value); 
} 

Если вы хотите заменить значение, то вы можете просто написать

if (atRow >= 0 && atRow < this->numberOfRows && 
    atColumn >= 0 && atColumn < this->numberOfColumns) 
{ 
    this->container[atRow][atColumn] = value; 
} 
Смежные вопросы