2014-02-18 3 views
1

В моей программе у меня есть массив «vector< vector<double> > convos» с 3 строками и произвольным числом столбцов Nconv. Каждый столбец представляет собой возможную беседу между двумя людьми из группы с размером N, а вторая & 3-я ячейка в каждом столбце содержит номер, обозначающий конкретного человека.Манипулирование векторным массивом с помощью функции void C++

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

convos [I] [2] = 1 2 3 2 3

convos [я] [1] = 0 0 0 1 1 .... и так далее.

Код, который я написал для работы, но слишком грязный, чтобы оставить его в моем int main(), и, вероятно, хорошей практикой является использование внешних функций.

Моя проблема заключается в том, что когда я вызываю функцию insertpairs в моем основном коде, ничего не происходит ... Может ли кто-нибудь указать что-то очевидное, что я здесь отсутствует?

#include <iostream> 
#include <vector> 

using namespace std; 
using std::vector; 

void insertpairs(vector<vector<double> > convos, int Nconv, int N) 
{ 
int a(0), b, c(0); 
while (c < Nconv){ 
    b = a+1; 
    while (b < N){ 
     convos[c][1] = a; 
     convos[c][2] = b; 
     b++; 
     c++; 
    } 
    a++; 
    } 
} 

int main(){ 

int N(4), Nconv; 
vector<vector<double> > convos; 

Nconv = 0; 
for (int i=1; i<=N; i++){ 
    Nconv = Nconv + N-i; 
} // Calculates # of possible convos based on N. 

insertpairs(convos, Nconv, N); 
     // breakpoint here. 
..... // code continues, but rest isn't relevant. 
} 

Если я ставлю точку останова внутри пустой функции я могу видеть, что она работает правильно, однако, когда он заканчивает все значения в массиве convos просто вернуться к нулю. Почему это?

ответ

2

вектор не меняется, потому что вы передаете его по значению:

void insertpairs(vector<vector<double> > convos, int Nconv, int N) 

Это означает, что вектор будет скопировано в переменную, которая является локальной по отношению к функции. Изменения выполняются на этой копии и уничтожаются после возвращения функции. Вы должны пройти вектор по ссылке:

void insertpairs(vector<vector<double> >& convos, int Nconv, int N) 

Смотрите эту question для более подробного объяснения разницы.

Если я ошибаюсь, вы передаете пустой вектор и добавляете к нему значения? В этом случае, это может быть проще не пройти любой вектор, но создать вместо него новый:

vector<vector<double> createpairs(int Nconv, int N) { 
    vector<vector<double> pairs; 
    // now add the pairs here 
    return pairs; 
} 

И в основной:

vector<vector<double> > convos = createpairs(Nconv, N); 
+0

Nice один спасибо! – fred

+0

Я добавил еще один подход, если вы сочтете это полезным. – user2079303

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