我知道有一個相同的主題here和很多類似的問題,但我有一個數組的問題,我真的沒有找到答案。 因此,對於的exaple,如果我有裏面有很多元素的數組,但大部分都是0這樣的:如何在c + +中使用數組
int array[1000]={0,0,0,3,0,0,......0,4,0,0,7,0}
,我想做出一個新的數組,它僅包含非0元素(因爲後面的非0號碼的位置將非常重要)。我怎樣才能做到這一點? 對不起,如果這是一個已經問過的問題,但我沒有解決方案或沒有找到確切的解決方案。
我知道有一個相同的主題here和很多類似的問題,但我有一個數組的問題,我真的沒有找到答案。 因此,對於的exaple,如果我有裏面有很多元素的數組,但大部分都是0這樣的:如何在c + +中使用數組
int array[1000]={0,0,0,3,0,0,......0,4,0,0,7,0}
,我想做出一個新的數組,它僅包含非0元素(因爲後面的非0號碼的位置將非常重要)。我怎樣才能做到這一點? 對不起,如果這是一個已經問過的問題,但我沒有解決方案或沒有找到確切的解決方案。
也許使用一個結構來存儲位置和值?
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 /新的呼叫一般非常昂貴,這是不好的做法是請的每一次新內存(小)塊你打到一個非零值。另一方面,如果預先計算了非零的數量,則需要對數組遍歷兩次。所以這一切歸結爲兩個問題:你的陣列有多大和多少稀疏?
內存泄漏有什麼意義?爲什麼不簡單地存儲'elem'對象?爲什麼'新'載體? – juanchopanza
如果釋放所有分配,則沒有內存泄漏。這只是一個摘錄,我故意跳過釋放,因爲它不會給我的答案添加任何內容。我使用動態分配,因爲它更靈活。 GergelyBárány表示,這些職位在**之後很重要**,也許在堆疊物件已經被銷燬的時候。但這一切都取決於用例。堆棧分配當然也是有效的。 – flowit
這裏沒有必要進行明確的分配,而且靈活性絕對沒有增益。我想你應該花一些時間學習C++。 – juanchopanza
可以使用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)); });
你能否澄清的問題?你是否希望新數組包含來自原始數組的非零元素的*位置*(即索引),還是希望它包含非零*值*? – blazs
你嘗試過自己實現嗎?你的實現有什麼問題? – user2079303