Можно использовать хеш, который содержит только одно значение для каждого ключа:
Hash[*recs.map{|ar| [ar[attr],ar]}.flatten].values
Идея заключается в том, что хотя FlashRegion выглядит как структура фиксированного размера, на самом деле он имеет динамический размер. Магия происходит при выделении структуры - вместо вызова (FlashRegion *) malloc (sizeof (FlashInfoEx))
или new FlashRegion
вы вызываете что-то вроде (FlashRegion *) malloc (sizeof (FlashInfoEx) + sizeof (FlashRegion) * (numRegions-1))
Это довольно распространенная идиома языка Си для структур переменного размера. Чтобы это работало, вам нужно убедиться, что вы выделяете достаточно памяти для нужного размера массива, обычно что-то вроде
pFlashInfoEx = malloc(offsetof(PFlashInfoEx, region) + g_pStorageDesc->dwNumRegions * sizeof(FlashRegion));
, это плохо взаимодействует с попыткой использовать 'new' в C ++; вам нужно выделить память вручную:
void *mem = ::operator new(offsetof(PFlashInfoEx, region) + g_pStorageDesc->dwNumRegions * sizeof(FlashRegion));
pFlashInfoEx = new(mem) PFlashInfoEx;
for (int i = 1; i < g_pStorageDesc->dwNumRegions; i++)
new (&pFlashInfoEx->region[i]) FlashRegion;
Используемый вами интерфейс использует структуру struct hack . Это означает, что вам необходимо вручную динамически выделить достаточно памяти для структуры, как если бы она была объявлена с областью, являющейся массивом более 1 FlashRegion
.
Для этого интерфейса должно быть достаточно места для как минимум и массив dwNumRegions
FlashRegion
s.
Что-то вроде offsetof (FlashInfoEx,
... см. этот ответ по устаревшим шаблонам проектирования , используя простой пример из предыдущего вопроса.