2014-03-12 3 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은 컴파일시 알려야합니다. 컴파일 시간에 대신 std::vectors를 사용해야 할이 두 변수를 알 수없는 경우 당신은

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

로 선언 할 수 있습니다 (예 : std::array에 대한 것과 같은)

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

왜 const 참조? – zoska

+0

만약 m이 읽기 전용이라면 그냥 참고가 아니라면 좋은 생각입니다 ... 정확한 상황을 모르겠습니다. –

+0

. OP는 const 참조를 사용하지 않으므로 확인하지 않고 왜 넣는가? – zoska

0

템플릿 인수를해야합니다 컴파일시 알려진. 일반적으로 말해서, 당신은 두 가지 크기에 템플릿되는 함수, 예를 들어 작성할 수 있습니다

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::vector<std::vector<T>>를 사용하는 방식으로

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

, 당신은 당신의 프로그램이 강력한 또는 빨리하려는 경우 끔찍한, 끔찍한 생각이다. 각 내부 vector의 길이를 수동으로 관리하고 신중하게 추적해야 할뿐만 아니라, N x M 길이 배열이 아닌 N M 길이의 배열을 개별적으로 힙 할당함으로써 엄청난 성능을 보입니다.

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