Изменение исходного вектора не меняет его в коллекции - PullRequest
2 голосов
/ 02 декабря 2011

Почему я получаю другой вывод? Как я могу это исправить? Я хочу, чтобы TrainingVector [0] ссылался на A.

vector<double> A(4,0);
vector<vector<double > > trainingVector;
A[0]=1;
trainingVector.push_back(A); 
A[0]=2;
cout << A[0] << endl ;
cout << trainingVector[0][0] << endl ;

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Вы не можете хранить ссылки в контейнерах STD, поэтому то, что вы просите, невозможно. Если вы хотите trainingVector сохранить указатель до A, это вполне выполнимо:

vector<double> A(4,0);
vector<vector<double>*> trainingVector;

A[0] = 1;
trainingVector.push_back(&A);
A[0] = 2;

// notice that you have to dereference trainingVector[0] to get to A
cout << (*trainingVector[0])[0] << endl; // prints 2
0 голосов
/ 02 декабря 2011

Вместо этого вы можете сохранить указатель на A:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> A(1);
    A[0] = 1;
    std::vector<std::vector<int>*> trainingVector;
    trainingVector.push_back(&A);
    A[0] = 2;
    std::cout << A[0] << std::endl;
    std::cout << (*trainingVector[0])[0] << std::endl;
    return 0;
}

В качестве альтернативы, если вам действительно нужен синтаксис, указанный в вопросе, вы можете сделать что-то вроде этого:

#include <iostream>
#include <vector>

template <typename T>
class VecRef
{
private:
    std::vector<T> *m_v;

public:
    VecRef(std::vector<T>& v)
    :   m_v(&v)
    {}

    T& operator[](int i)
    {
        return (*m_v)[i];
    }
};

int main()
{
    std::vector<int> A(1);
    A[0] = 1;
    std::vector<VecRef<int>> trainingVector;
    trainingVector.push_back(A);
    A[0] = 2;
    std::cout << A[0] << std::endl;
    std::cout << trainingVector[0][0] << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...