C ++ Как изменить значение 2Dvector, используя ссылку на определенный элемент? - PullRequest
0 голосов
/ 21 февраля 2019

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

#include <iostream>
#include <vector>

using namespace std;

int &Give2DVectorRef(int i, int j, vector<vector<int>> &matrix) {
    return matrix.at(i).at(j);
}

int main() {
    vector<vector<int>> matrix{
        {1, 1, 1, 1, 1}, {2, 2, 2, 2, 2}, {3, 3, 3, 3, 3}};
    int ref;
    ref = Give2DVectorRef(1, 3, matrix);
    ref = 55;

    cout << matrix.at(1).at(3) << endl; // print 2, but I expect 55
    return 0;
}

1 Ответ

0 голосов
/ 21 февраля 2019

Краткий ответ - изменить с

int ref;
ref = Give2DVectorRef(1, 3, matrix);

на

int &ref = Give2DVectorRef(1, 3, matrix);

(как уже прокомментировал @ user1810087)

Вот еще несколько комментариев к вашему коду

  • Ссылки на векторные элементы могут быть опасными.

Изображение

 int & ref = Give2DVectorRef(1, 3, matrix); 
 matrix[1].erase(matrix[1].begin()+2); //deletes the third item
 ref = 55; // Reference is no longer meaningful 

Эта ситуация также может возникнуть, если вставить элемент перед местоположением элемента, на который есть ссылка.

  • Матрица не должна храниться как вектор векторов.Если вы используете эту конструкцию в тяжелых численных расчетах, вы столкнетесь с серьезными проблемами производительности.Один вектор длины (N * M) будет быстрее.Еще лучше использование библиотеки, такой как Eigen .

  • Если вас беспокоит производительность, оператор .at работает медленнее, чем оператор [].

  • Избегайте использования using namespace std;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...