Понимание указателя на вектор кода указателей

#c #pointers #vector #struct #malloc

#c #указатели #вектор #структура #мэллок

Вопрос:

(Я не писал этот код. Это существующий фрагмент кода из домашней работы по параллельным алгоритмам Калифорнийского университета в Беркли, который я должен распараллелить с помощью Pthreads) В функции моего домашнего задания по параллельным алгоритмам есть этот фрагмент кода int main() :

 particle_t *particles = (particle_t*) malloc( n * sizeof(particle_t) ); init_particles( n, particles ); vectorlt;particle_t*gt; *bins = new vectorlt;particle_t*gt;[numbins];  

с particle_t определением вне int main() как:

 typedef struct  {  double x;  double y;  double vx;  double vy;  double ax;  double ay; } particle_t;  

и init_partciles() как :

 void init_particles( int n, particle_t *p ) {  srand48( time( NULL ) );    int sx = (int)ceil(sqrt((double)n));  int sy = (n sx-1)/sx;    int *shuffle = (int*)malloc( n * sizeof(int) );  for( int i = 0; i lt; n; i   )  shuffle[i] = i;    for( int i = 0; i lt; n; i   )   {  //  // make sure particles are not spatially sorted  //  int j = lrand48()%(n-i);  int k = shuffle[j];  shuffle[j] = shuffle[n-i-1];    //  // distribute particles evenly to ensure proper spacing  //  p[i].x = size*(1. (k%sx))/(1 sx);  p[i].y = size*(1. (k/sx))/(1 sy);   //  // assign random velocities within a bound  //  p[i].vx = drand48()*2-1;  p[i].vy = drand48()*2-1;  }  free( shuffle ); }  

Фрагмент кода, который я не могу понять, находится здесь

 // clear bins at each time step  for (int m = 0; m lt; numbins; m  ) bins[m].clear();   // place particles in bins  for (int i = 0; i lt; n; i  )  bins[binNum(particles[i],bpr)].push_back(particles   i);  

Как я понимаю, ячейки bins , являются указателями на particle_t объекты, а не сами векторы. К сожалению, в первом цикле bins клетки обрабатывались как сами векторы, потому .clear() что на них использовалась функция. Во втором цикле также bins клетки обрабатывались как векторы сами по себе, используя .push_back() на них. Где же это недоразумение? Код каждый раз успешно компилируется.

Комментарии:

1. Почти никогда не бывает причин иметь указатель на стандартный контейнер. Для чего следует использовать bins вектор векторов.

2. На аналогичной ноте вы почти никогда не должны использовать malloc в коде C . particles также должен быть вектор. На самом деле, всякий раз, когда вам нужно выполнить приведение в стиле C в C (как вы делаете для malloc ), вы должны воспринимать это как признак того, что вы делаете что-то не так. Если показанный код был передан вам от кого-то другого, то этому другому человеку нужно вернуться в школу и правильно выучить C .

3. «Как я понимаю, ячейки bins , являются указателями на particle_t объекты, а не сами векторы». — неточно. Подумайте так: bins является ли указатель на что-то, назовем это X. Мыслите абстрактно. Если бы X был int (то есть у вас было что-то вроде int *intptr ), то что бы у вас было, если бы вы использовали индекс в своей переменной? То есть, какой был бы тип intptr[0] ? В этом конкретном случае замените X int , чтобы вернуться к абстрактному, затем замените «вектор указателей» на X, чтобы вернуться к вашему вопросу.

4. bins это указатель, но в вашем случае он указывает на динамически распределенный массив векторов. Как уже было сказано, вместо этого следует использовать вектор векторов.

5. (Я бы подумал об ответе, но вся предпосылка указателя на вектор настолько противоречит обычной практике C , что я задаюсь вопросом о долгосрочной ценности наличия этого вопроса-ответа в переполнении стека.)