Вопрос о динамическом распределении в векторах

#c #arrays #vector #struct #stl

#c #массивы #вектор #структура #stl

Вопрос:

 #include lt;iostreamgt; #include lt;vectorgt; #include "malloc.h"  using namespace std;  int main() {  // Write C   code here  vectorlt;vectorlt;vectorlt;int*gt;gt;gt; storage;  for (int i=0; ilt; 13; i  )  {  storage.push_back(vectorlt;vectorlt;int*gt;gt;());   for (int j=0; jlt; 13; j  )  {  storage[i].push_back(vectorlt;int*gt;());   storage[i][j].push_back((int*)malloc(5 * sizeof(int)));    for (int k =0; klt;4; k  )  {  storage[i][j][k]=k;  }  }  }    return 0; }  

Я пытаюсь динамически выделить список внутри самого внутреннего измерения последнего вектора, но оказывается, что при попытке задать значение вектору возникает ошибка компиляции:

ошибка: недопустимое преобразование из ‘int’ в ‘__gnu_cxx::__alloc_чертыlt;std::распределительlt;int*gt;, int*lt;int*gt;gt;::тип значения’ {он же ‘int*’} [-fpermissive]

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

1. Если вы спрашиваете, что означает сообщение об ошибке, пожалуйста, вставьте полное сообщение в свой вопрос. Я подозреваю, что ваша ошибка как-то связана с различием между int и int* .

2. Я пытаюсь динамически выделить список внутри самого внутреннего измерения последнего вектора , не делайте этого, просто используйте другой вектор и позвольте ему управлять памятью за вас.

3. Всякий раз, когда вы чувствуете необходимость использовать приведение в стиле C (как вы это делаете (int*)malloc(...) ), вы должны воспринимать это как признак того, что вы делаете что-то не так.

4. Вам нужен массив 3D или 4D? Если вы хотите 4D, у вас слишком мало вложенных циклов и слишком мало уровней [] . Если вы хотите 3D, у вас слишком много массивов на один слой. (В этом случае я рекомендую удалить * и. malloc Кстати malloc.h , это неправильный заголовок, вам нужно stdlib.h ) Тот факт, что у вас есть storage[i] и storage[i][j] на одном и том же уровне отступов прямо рядом друг с другом, является намеком на то, что происходит что-то подозрительное.

5. Кажется довольно необычным, что вам разрешено использовать std::vector большинство измерений вашего объекта, но вы обязаны использовать очень недружественный C malloc именно для одного из измерений.

Ответ №1:

Сообщение об ошибке сообщает вам, что вы пытаетесь назначить an int для an int* . В частности, по этому заявлению:

 storage[i][j][k]=k;  

storage[i][j][k] возвращает (ссылку на) an int* , но k является an int .

Поскольку у вас есть 3 уровня векторов, содержащих int[] массив, вам нужно 4 цикла для инициализации отдельных int s, но у вас есть только 3 цикла, поэтому добавьте еще один цикл:

 #include lt;iostreamgt; #include lt;vectorgt;  using namespace std;  int main() {  vectorlt;vectorlt;vectorlt;int*gt;gt;gt; storage;  for (int i = 0; i lt; 13;   i)  {  storage.push_back(vectorlt;vectorlt;int*gt;gt;());    for (int j = 0; j lt; 13;   j)  {  storage[i].push_back(vectorlt;int*gt;());   for(int k = 0; k lt; N;   k) // lt;-- decide what N should be!  {  storage[i][j].push_back(new int[5]);    for (int m = 0; m lt; 5;   m)  {  storage[i][j][k][m] = k;  }  }  }  }    // don't forget to delete[] all of the new[]'ed arrays!  // consider using either std::unique_ptrlt;int[]gt; or  // std::arraylt;int,5gt; instead of int* ...   return 0; }  

Я бы предложил упростить код, чтобы сделать его более читабельным, например:

 #include lt;iostreamgt; #include lt;vectorgt; #include lt;arraygt; using namespace std;  using arr5Ints = arraylt;int, 5gt;; using vec1D_arr5Ints = vectorlt;arr5Intsgt;; using vec2D_arr5Ints = vectorlt;vec1D_arr5Intsgt;; using vec3D_arr5Ints = vectorlt;vec2D_arr5Intsgt;;  int main() {  vec3D_arr5Ints storage(  13,  vec2D_arr5Ints(  13,  vec1D_arr5Ints(N) // lt;-- decide what N should be!  )  );   for (auto amp;vec2d : storage)  {  for (auto amp;vec1d : vec2d)  {  for(auto amp;arr : vec1d)  {  int k = 0;  for (int amp;i : arr)  {  i = k  ;  }  }  }  }   return 0; }  

Ответ №2:

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

 vectorlt;vectorlt;int*gt;gt; storage;  

Затем вы можете индексировать массив в стиле C, как и ожидалось.

storage[i][j] в настоящее время открывается страница vector int* , в которой вы нажали только один элемент. Однако , если вы хотите, чтобы остальная часть вашего кода оставалась такой же, как вы могли бы просто сделать storage[i][j][0][k]=k , я бы посоветовал вместо этого удалить измерение.

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

1. Спасибо. Но в коде, который я вставил, это приводит к ошибке сегментации. Похоже, я тоже упускаю что-то еще.

2. Я исправил свой ответ! ^^