0

Transpose 関数が の代わりにポインターを取るようにしようとしています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**が機能しないのですか?

4

1 に答える 1

3

2 次元配列は double ポインターに崩壊しません。に崩壊しT*[]ます。説明については、このスレッドを参照してください。

障害のある行を次のように変更する必要があります。

void Transpose(T* Data[], std::size_t Size)

または(長さを推測できるように)

template <typename T, std::size_t Size1, std::size_t Size2>
void Transpose(T (&Data)[Size1][Size2])
于 2013-06-09T17:45:22.260 に答える