2014-03-12 134 views
1

我是新來的std :: array。我必須創建這個功能C++通過函數std :: array std :: array

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

其中a和b是兩個固定的整數值。 我該怎麼辦?

預先感謝您!

+0

我沒有在那裏看到'a'。 – Oktalist

+0

第一個(「內部」)'&'似乎放錯了位置,而不是如果你真的在數組引用之後(這似乎不太可能)。 –

+0

謝謝你,你是對的! – ThePunisher

回答

0

「變量」ab必須是是編譯時常量。如果您希望它們在運行時變化或設置,則必須改用std::vector

-1

ab必須在編譯時知道。你可以聲明爲

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

如果不能夠知道在編譯時這兩個可變你必須使用std::vectors代替:

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

爲什麼const引用? – zoska

+0

如果m是隻讀是一個好主意,如果不僅僅是一個參考...我不知道確切的情況 –

+0

。 OP不使用const引用,所以爲什麼把它沒有確認? – zoska

0

模板參數(如那些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>>是,如果你想你的程序是可靠或快速可怕,可怕的想法。您不僅需要手動管理並仔細跟蹤每個內部的長度,還可以單獨分配長度較長的陣列而不是單個長度的陣列,從而獲得巨大的性能。

0

正如所提到的pmttavara,你可以執行編譯時間扣除的尺寸和類型。

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; 
}