簡體   English   中英

C ++通過函數std :: array的std :: array

[英]C++ Passing through a function an std::array of std::array

我是std :: array的新手。 我必須創建此功能

void foo(std::array < std::array <double, a>& , b> & previous)

其中a和b是兩個固定的整數值。 我應該怎么做?

先感謝您!

“變量” ab 必須是編譯時常量。 如果希望它們在運行時是可變的或設置的,則必須改用std::vector

模板參數(例如std::array )必須在編譯時知道。 一般而言,您可以編寫以兩種尺寸為模板的函數,例如:

template <std::size_t N, std::size_t M>
void foo(std::array<std::array<double, N>, M> &previous) {
    // code goes here, e.g.:
    previous[M - 1][N - 1] = static_cast<double>(M * N);
}

模板參數將由函數參數類型推導,因此您的數組數組可以具有所需的任何維,並且在調用foo時無需指定它們。

std::array<std::array<double, 10>, 20> my_array;
foo(my_array); // equivalent to foo<10, 20>(my_array);

順便說一句,如果您希望程序健壯或快速,那么使用std::vector<std::vector<T>>是一個可怕的可怕想法。 不僅必須手動調整並仔細跟蹤每個內部vector的長度,而且通過單獨堆分配N M長度的數組而不是單個N x M長度的數組,也會帶來巨大的性能損失。

如前所述,您可以執行尺寸和類型的編譯時推導。

template <typename Scalar, std::size_t I, std::size_t J>
void
Foo(std::array<std::array<Scalar, I>, J>& previous) {
}

int main() {
        std::array<std::array<double, 10>, 20> data;
        Foo(data);
}

或者,您可以將此數據視為矩陣。

template <typename Scalar>
class Matrix {
public:
    Matrix(std::size_t rows, std::size_t cols)
        : rows(rows)
        , cols(cols)
        , data(rows * cols, Scalar(0))
    {}

    Scalar&
    at(std::size_t row, std::size_t col) {
        std::size_t n = (row * cols) + col;
        return data.at(n);
    }

private:
    std::size_t rows;
    std::size_t cols;
    std::vector<Scalar> data;
};

int main() {
        Matrix<double> m(3, 3);
        m.at(2, 2) = 3;
}

必須在編譯時知道ab 您可以將它們聲明為

constexpr int a = 10;
constexpr int b = 100;

如果在編譯時無法知道這兩個變量,則必須改用std::vectors

typedef std::vector< const std::vector > Matrix;
void f( const Matrix& m );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM