我试图让我的转置函数采用指针而不是std::arrays
. 我想这样做的原因是因为我可以将指针或std::array
通过.data()
函数传递给它。
目前我有以下内容,它可以使用 2D 和 1D 数组进行原地转置或转换为新数组。但是,将以下代码转换为采用指针会产生内存访问冲突错误。
有人可以解释差异以及为什么下面不等于我的指针版本(在下面):
#include <iostream>
#include <array>
template<typename T, std::size_t Size>
void Transpose(std::array<T, Size> &Data)
{
int Width = sqrt(Size);
for (int I = 1; I < Width; ++I)
{
for (int J = 0; J < I; ++J)
{
std::swap(Data[I * Width + J], Data[J * Width + I]);
}
}
}
template<typename T, std::size_t Size>
void Transpose(std::array<std::array<T, Size>, Size> &Data)
{
for (int I = 0; I < Size; ++I)
{
for (int J = 0; J < I; ++J)
{
std::swap(Data[I][J], Data[J][I]);
}
}
}
但是,当我使用指针时转换为以下内容不起作用:S
template<typename T>
void Transpose(T* Data, std::size_t Size)
{
int Width = sqrt(Size);
for (int I = 1; I < Width; ++I)
{
for (int J = 0; J < I; ++J)
{
std::swap(Data[I * Width + J], Data[J * Width + I]);
}
}
}
template<typename T>
void Transpose(T** Data, std::size_t Size)
{
for (int I = 0; I < Size; ++I)
{
for (int J = 0; J < I; ++J)
{
std::swap(Data[I][J], Data[J][I]);
}
}
}
谁能解释一下区别以及为什么T**
一个不起作用?