#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
большинство измерений вашего объекта, но вы обязаны использовать очень недружественный Cmalloc
именно для одного из измерений.
Ответ №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. Я исправил свой ответ! ^^