Как создать новый вектор в каждой итерации? - PullRequest
1 голос
/ 02 декабря 2011

Когда я запускаю код ниже, в моем trainingVector я получаю:

{(10,0),(10,0),(10,0)...}

вместо:

{(0,0),(1,0),(2,0)...}

Как мне сделать это правильно?

vector< vector< double > * > trainingVector; 
for(int i=0;i<10;i++){     
    vector<double> ok (2,0);
    ok[0]=i;
    trainingVector.push_back(&ok)
}

Ответы [ 2 ]

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

Только не используйте указатели.

std::vector<std::vector<double>> trainingVector;
for (int i = 0; i < 10; ++i) {
    std::vector<double> ok(2, 0);
    ok[0] = i;
    trainingVector.push_back(ok);
}

Также рассмотрите возможность использования Boost.MultiArray .

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

Метод, который вы используете сейчас, не будет работать, потому что жизнь каждого векторного объекта ok длится только в течение итерации, прежде чем он выпадет из области видимости и умрет.

Вам нужно сделать это вместо этого:

vector< vector< double > * > trainingVector; 
for(int i=0;i<10;i++){     
   vector<double> *ok = new vector<double>(2,0);
   (*ok)[0]=i;
   trainingVector.push_back(ok);
}

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

for(int i=0;i<10;i++){     
   delete trainingVector[i];
}

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

vector< vector< double > > trainingVector; 
for(int i=0;i<10;i++){     
   vector<double> ok(2,0);
   ok[0]=i;
   trainingVector.push_back(ok);
}

Хотя этот последний метод подразумевает копирование внутреннего вектора, когда онположить во внешний вектор.

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