Есть ли способ получить индекс массива 1D-массива из 2D-массива?
Например: у меня есть 2D-массив, размер массива неизвестен и изменяется (я использовал std :: vector) для push_back по мере необходимости. Это отлично работает, пока его 2D-массив, но мне нужно получить индекс массива 1D этого 2D-массива.
2D array:
Group 1 - 1, 2, 3
Group 2 - 4, 5, 6
Group 3 - 7, 8, 9, 10, 11, 12
и так далее.
Итак, в основном есть быстрый способ узнать, что когда 6 выбрано из группы 2, т.е. Array [1] [2] = 6 => Мне нужен индекс массива как: 1D array => Array [5] = 6 => ie Мне нужно 5, как мой ответ. Я пробовал несколько вещей, но пока не повезло. Какие-либо предложения?
Если ваши данные статичны, вы можете создать другой массив, в котором вы будете хранить смещение для каждого массива 1D. Для вашего примера у вас будет следующий offset = {0, 3, 6}
массива offset = {0, 3, 6}
. Затем вы можете найти индекс по offset[row] + col
.
Если вы можете изменить размеры строк, вы можете сохранить размер каждой строки в двоичном индексированном дереве и найти смещение в O (log n) с помощью одного запроса, где n - количество строк (1D векторов). Тем не менее, каждый раз, когда вы изменяете размер строки, вам нужно будет снова обновить структуру в O (log n).
Если вы создаете вектор векторов (или список векторов), то места памяти не гарантируются. Поэтому, чтобы заставить его вести себя как 1-мерный массив, вам нужно будет поместить контейнер в свой класс и перегрузить operator[]
. Затем этому оператору необходимо будет проверить индекс, чтобы определить правильный векторный элемент для возврата. Упрощенная версия может выглядеть так:
T& operator[](std::size_t index)
{
std::size_t temp = index;
if (index < myVectors[0].size())
{
return myVectors[0][index];
}
temp = index - myVectors[0].size()
if (temp < myVectors[1].size())
{
return myVectors[1][temp];
}
// etc ...
}
Вы можете упростить его до цикла:
T& operator[](std::size_t index)
{
std::size_t temp = index;
for (std::size_t i = 0; i < myVectors.size(); ++i)
{
if (temp < myVectors[i].size())
{
return myVectors[i][temp];
}
temp -= myVectors[i].size();
}
throw std::out_of_range("Array access out of bounds!");
}