簡體   English   中英

指向傳染媒介的指針向量

[英]Pointer to vector of pointers to vectors

我錯了什么?

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)他們的元素)等)。

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使向量更resize ,通常不會釋放其內存。 你需要使用一個技巧:

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

注意,這只有在使矢量小得多時才有用; 當它變大或變化很小時,最好堅持resize

最好的解決方案可能是找到現有的線性代數庫並使用現有的三角矩陣類。

暫無
暫無

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

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