从2D数组中获取1D数组索引
Get 1D array index from a 2D array
有没有办法从2D数组中获取1D数组的数组索引?
例如:我有一个2D数组,数组大小未知,需要时会更改(我使用了std::vector)为push_back。只要是2D数组,这就可以很好地工作,但我需要得到这个2D数组的1D数组索引。
2D array:
Group 1 - 1, 2, 3
Group 2 - 4, 5, 6
Group 3 - 7, 8, 9, 10, 11, 12
等等
因此,基本上有一种快速的方法可以知道,当从组2中选择6时,即数组[1][2]=6=>我需要数组索引为:1D数组=>数组[5]=6=>即我需要5作为我的答案。我试了好几种方法,但到目前为止都没有成功。有什么建议吗?
如果您的数据是静态的,您可以制作另一个数组,在其中存储每个1D数组的偏移量。对于您的示例,您将拥有以下数组offset = {0, 3, 6}
。然后你可以通过offset[row] + col
找到索引。
如果可以更改行大小,则可以将每行的大小存储在二进制索引树中,并通过单个查询在O(logn)中找到偏移量,其中n是行数(1D向量)。但是,每次更改行大小时,都必须在O(logn)中再次更新结构。
如果您正在创建一个向量向量(或向量列表),则不能保证内存位置是相关的。因此,为了使它表现得像一个一维数组,您需要将容器包装在自己的类中并重载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!");
}
相关文章:
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 如何使用指针C++将元素从2D数组复制到1D数组
- 借助功能将 2D 转换为 1D 数组
- 使用C++将1D数组转换为2D字符串数组
- C++ 矩阵乘法 2D 数组比 1D 更快
- 使用 std::transform 在 2d C 阵列上转换为 1d C 数组
- 在 C++ 中,用于将大型 2D 数组转换为 1D 数组的内存分配
- 将指向 1D Fortran 数组的指针传递给使用 C_LOC() 进行C++会导致垃圾值
- 表示为 1D 的多维数组(模板化为 n 维)
- 我的算法在 1D 数组中渲染矩形有什么问题
- 如何在C++中将 2d 矢量转换为 1d 数组?
- 在 C++ 中实现 1D 数组中的 2D 数组坐标
- 访问表示 2D 矩阵的 1D 存储数组
- C 将1D动态数组施放到2D数组以使用常规索引(例如ARR [i] [J])
- 如何将元素的索引从2D数组存储到1D数组中,然后交换这些值
- C++ 3D 数组到 1D 会导致堆缓冲区溢出
- 我在将 cv::Mat 保存到 1D 数组时遇到问题
- C ,将1D数组转换为2D数组
- 数组 1D 我需要要求用户检查索引和打印值