2015-11-05 33 views
1

我知道有一個相同的主題here和很多類似的問題,但我有一個數組的問題,我真的沒有找到答案。 因此,對於的exaple,如果我有裏面有很多元素的數組,但大部分都是0這樣的:如何在c + +中使用數組

int array[1000]={0,0,0,3,0,0,......0,4,0,0,7,0} 

,我想做出一個新的數組,它僅包含非0元素(因爲後面的非0號碼的位置將非常重要)。我怎樣才能做到這一點? 對不起,如果這是一個已經問過的問題,但我沒有解決方案或沒有找到確切的解決方案。

+1

你能否澄清的問題?你是否希望新數組包含來自原始數組的非零元素的*位置*(即索引),還是希望它包含非零*值*? – blazs

+0

你嘗試過自己實現嗎?你的實現有什麼問題? – user2079303

回答

-1

也許使用一個結構來存儲位置和值?

struct elem { 
    int pos; 
    int val; 
}; 

,並把這個結構在一個std ::矢量

std::vector<struct elem*> non_zero_elems; 

爲了填補這個矢量,你需要遍歷整個數組。使用一個for循環是:

for (unsigned i = 0; i < 1000; ++i) 
    if (array[i]) { 
    struct elem *ptr = malloc(sizeof(struct elem)); 
    ptr->pos = i; 
    ptr->val = array[i]; 
    non_zero_elems.push_back(ptr); 
    } 

編輯:也許一個關於性能一句話:因爲的malloc /新的呼叫一般非常昂貴,這是不好的做法是請的每一次新內存(小)塊你打到一個非零值。另一方面,如果預先計算了非零的數量,則需要對數組遍歷兩次。所以這一切歸結爲兩個問題:你的陣列有多大和多少稀疏?

+0

內存泄漏有什麼意義?爲什麼不簡單地存儲'elem'對象?爲什麼'新'載體? – juanchopanza

+0

如果釋放所有分配,則沒有內存泄漏。這只是一個摘錄,我故意跳過釋放,因爲它不會給我的答案添加任何內容。我使用動態分配,因爲它更靈活。 GergelyBárány表示,這些職位在**之後很重要**,也許在堆疊物件已經被銷燬的時候。但這一切都取決於用例。堆棧分配當然也是有效的。 – flowit

+0

這裏沒有必要進行明確的分配,而且靈活性絕對沒有增益。我想你應該花一些時間學習C++。 – juanchopanza

2

可以使用std::vector<std::pair<int, std::size_t>>存儲非零值,並按照以下方式原始索引數組中:

int A[] = {1, 0, 0, 3, 5, 0, 0, 2, 0, 0, 4, 0, 0}; 
std::vector<std::pair<int, std::size_t>> v; 
std::for_each(std::begin(A), std::end(A), 
[&A, &v](int const &i){ if(i) v.push_back(std::make_pair(i, &i - A)); }); 

LIVE DEMO

相關問題