0

私は何を間違えていますか?

vector<vector<unsigned int> *> *matrix
matrix = new vector<vector<unsigned int> *>(n);
for (vector<vector<unsigned int> *>::size_type i = 0; i < n; i++) {
    matrix->at(i) = new vector<unsigned int>(i + 1);
}

...

コード

vector<int> *myVector2 = new vector<int>(500000000);
for(size_t i = 0; i < myVector->size(); i++) {
    myVector->at(i) = i;
}
delete myVector;

正常に動作します。非常に大きな行列で作業する必要があります-行列全体を保存することは不可能であり、メモリ使用量を動的に変更する必要があります(すべての行がいっぱいではなく、いくつかの行のみを保存する場合があります(最初に k のみを表示する必要があります)それらの要素)など)。

4

1 に答える 1

2

newここではおそらく何も役に立ちません。の主な目的は、あなたvectorの呼び出しnewを処理することです。

typedef vector<vector<unsigned int> > matrix_t;
matrix_t matrix( n );
std::size_t row_index = 0;
for ( matrix_t::iterator i = matrix.begin(); i != matrix.end(); ++ i ) {
    i.resize( row_index + 1 );
    ++ row_index;
}

行の数または長さを変更する場合は、matrix.resize()またはを呼び出しますmatrix[n].resize()。これにより、割り当ての数が最小限に抑えられます。ただし、必要な最大の行列と同じ大きさの単一のフラット ベクトルにすべてをマップする方がよい場合があります。オンザフライでの解放と再割り当ては、不必要なキャッシュ ミスや VM ページングなどのさまざまな非効率性を引き起こします。

編集:でベクトルを小さくするとresize、そのメモリは通常解放されません。トリックを使用する必要があります:

std::vector< unsigned int >( new_row_length ).swap( v );

これは、ベクトルをはるかに小さくする場合にのみ役立つことに注意してください。大きくしたり、変化が小さい場合は、 に固執した方がよいでしょうresize

おそらく最善の解決策は、既存の線形代数ライブラリを見つけて、既存の三角行列クラスを使用することです。

于 2012-06-09T17:15:11.433 に答える