2011-12-29 5 views
0

T 타입의 매트릭스 클래스 MxN을 만들고 인스턴스화하고 인쇄하려고 시도했습니다. 코드 끝에서 문제가 발생했습니다 (내가했을 때 cout << m;) 그 명령은 다른 행렬의 일부 필드가있는 행렬을 인쇄했습니다. 실제로는 m의 첫 번째 열이 m2의 마지막 열과 같고 나는 왜 그것을 얻지 않는가?하나의 인스턴스가 다른 인스턴스에 영향을 미치지 만

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <string> 
#include <stdexcept> 

using namespace std; 


template<typename T, int M> 
class matrix_helper { 
public: 
    T& operator[](int j) { 
     return data[j]; 
    } 

private: 
    T data[M]; 
}; 

template<typename T, int N, int M> 
class matrix { 
public: 
    explicit matrix(const vector<T>& v) { 
     if (v.size() != M * N) 
      throw invalid_argument("Incorrect input data"); 

     int i=0, j=0; 

     for (int k = 0; k != M*N; ++k) { 
      data[i][j] = v[k]; 
      ++i; 
      if (i == M) { // i:0..M 
       i = 0; 
       ++j; 
      } 
     } 
    } 
    matrix_helper<T,M> operator[](int j) { 
     matrix_helper<T, M> mh; 
     for(int i=0; i != M; ++i) { 
      mh[i] = data[j][i]; 
     } 
     return mh; 
    } 
    matrix<T,M,N>& operator+=(matrix<T,M,N>& m) { 
     for(int i=0; i != N;++i) 
      for(int j=0; j != M;++j) { 
       this->data[i][j] += m[i][j]; // or - should I rather use (*this)[i][j] += ... ??? 
      } 

     return *this; 
    } 

private: 
    T data[N][M]; 
}; 

template<typename T, int N, int M> 
ostream& operator<<(ostream& os, matrix<T,N,M> & m) { 
     int i=0, j=0; 
     for (int k = 0; k != M*N; ++k) { 
      os << m[i][j] << '\t'; 
      ++i; 
      if (i == M) { // i:0..M 
       i = 0; 
       ++j; 
       os << endl; 
      } 
     } 
     os << endl; 
} 



int rnd(int max = 20) { return rand() % max; } 
void print(int i) { cout << i << ' '; } 

int main() { 

    vector<int> u, v; 
    for (int i = 0; i != 20; ++i) u.push_back(i); 

    for (int i = 20; i != 40; ++i) v.push_back(i); 
    //for_each(u.begin(), u.end(), print); 


    matrix<int, 4,5> m(u); 
    matrix<int, 4,5> m2(v); 
    cout << m; // returns: 24 1 2 3 4,... Why not 0 1 2 3 4 ??? 


    cout << endl; 
    system("pause"); 
    return 0; 
} 
+0

확인, 감사를 반환해야합니다. codereview을 몰랐습니다. 나는 몇 분을 기다릴 것이고 만약 내가 대답을 얻지 못하면 거기에 게시 할 것이다 ... – Novellizator

+0

Codereview는 "왜 이것이 내가 생각하는 것을하지 않는가"를 묻는 것이 아니다. –

+1

@Tomy - 어떤 곳에서는'matrix '를 사용하고 다른 곳에서는'matrix '를 사용합니다. 그게 목적인가? –

답변

4

당신은 [N][M]의 배열을 선언하지만 [M][N] 것처럼 초기화 코드가 처리합니다.

-1

matrix :: data 배열에 메모리를 할당해야합니다.

당신은 다음과 같이 수정할 수,

T data[N][M]; => 당신은 m에 m2에서 값을 볼 수 있다는 사실이 매트릭스 때문이다

data.assign(M, std::vector<T>()); 
for (int x=0; x<M; ++x) 
    data[x].assign(N, T()); 
1

생성자 std::vector< std::vector<T> > data;

그런 준비 벡터, ctor는 데이터 배열 경계 밖에서 스택 근처에있는 모든 항목을 덮어 쓰고 있습니다. 정확히이 행은 다음과 같습니다.

data[i][j] = v[k]; 

외부로 배열 범위를 씁니다.

또한

ostream& operator<<() 

값을

관련 문제