Получить 1D индекс массива из 2D массива

0

Есть ли способ получить индекс массива 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, как мой ответ. Я пробовал несколько вещей, но пока не повезло. Какие-либо предложения?

  • 0
    Была ли сумма из всех предыдущих групп плюс индекс в текущей группе среди того, что вы пробовали?
  • 0
    Если вы используете C ++, не используйте необработанные массивы для хранения матриц. Используйте тип матрицы ADT (например, предоставляемый библиотеками линейной алгебры) и вызовите их функцию-член .data ().
Теги:
arrays
math
2d

2 ответа

2
Лучший ответ

Если ваши данные статичны, вы можете создать другой массив, в котором вы будете хранить смещение для каждого массива 1D. Для вашего примера у вас будет следующий offset = {0, 3, 6} массива offset = {0, 3, 6}. Затем вы можете найти индекс по offset[row] + col.

Если вы можете изменить размеры строк, вы можете сохранить размер каждой строки в двоичном индексированном дереве и найти смещение в O (log n) с помощью одного запроса, где n - количество строк (1D векторов). Тем не менее, каждый раз, когда вы изменяете размер строки, вам нужно будет снова обновить структуру в O (log n).

  • 0
    технически смещение было бы параметром .size () в std :: vector, не так ли для каждой группы?
  • 1
    @TheNewbie Да, накопленные параметры .size () каждой группы. (в качестве смещения будет массив)
Показать ещё 3 комментария
0

Если вы создаете вектор векторов (или список векторов), то места памяти не гарантируются. Поэтому, чтобы заставить его вести себя как 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!");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню