我在列表中有很多數據,比如說每個元素有幾個字節,我想每個數據都要進行一些數字處理。這些數據最初存儲爲float []。由於處理涉及很多索引和全局計算,我認爲valarray可能很容易編程。但是,如果我使用valarray,我可能不得不首先從數組複製到valarray,然後將其複製回數組。有什麼辦法可以避免這種情況?任何方式讓我直接在數組上工作?或者你有更好的方法來解決類似的問題?有沒有辦法避免valarray和數組之間的複製?
2
A
回答
1
valarray
類型沒有提供任何方式將現有數組用於其數據存儲;它總是爲自己製作一個副本。不要將數據存儲在普通數組中,而應將數值從一開始直接存儲在valarray
中。調用v.resize
來設置大小,並使用[]
運算符爲其分配值,或使用&v[0]
獲取指向第一個值的指針,並像迭代器或緩衝區指針那樣使用它 - 將valarray
的元素連續存儲在內存中。
+0
謝謝,我明白你的意思。問題是我無法改變之前涉及太多變化的陣列設計。 – shangping
1
警告:醜陋的黑客。
在我的系統(MS Visual Studio中)的valarray
類的定義是這樣的:
template<class _Ty>
class valarray
{
...
private:
_Ty *_Myptr; // current storage reserved for array
size_t _Mysize; // current length of sequence
size_t _Myres; // length of array
};
這樣我就可以建立自己的類,它具有相同的佈局(具有良好的置信度):
struct my_valarray_hack
{
void *_Myptr;
size_t num_of_elements;
size_t size_of_buffer;
};
然後創建一個空的valarray
並覆蓋其內部變量,使其指向您的數據。
void do_stuff(float my_data[], size_t size)
{
valarray<float> my_valarray;
my_valarray_hack hack = {my_data, size, size};
my_valarray_hack cleanup;
assert(sizeof(my_valarray) == sizeof(hack));
// Save the contents of the object that we are fiddling with
memcpy(&cleanup, &my_valarray, sizeof(cleanup));
// Overwrite the object so it points to our array
memcpy(&my_valarray, &hack, sizeof(hack));
// Do calculations
...
// Do cleanup (otherwise, it will crash)
memcpy(&my_valarray, &cleanup, sizeof(cleanup));
// Destructor is silently invoked here
}
這是不做事的推薦的方式;你應該考慮它,只有當你沒有其他的方式來實現你想要的東西(也許甚至沒有)。可能的原因則可能會失敗:
- 的
valarray
佈局可以在編譯的另一種模式是不同的(模式的例子:調試/釋放;不同的平臺,不同版本的標準庫) - 如果你的計算調整
valarray
將以任何方式嘗試重新分配緩衝區並崩潰 - 如果
valarray
的實現假定其緩衝區具有例如16字節對齊,它可能會崩潰,做計算錯誤或只是工作緩慢(根據您的平臺) - (我相信有一些原因吧不工作)
不管怎麼說,這是描述作爲標準的「未定義行爲」,嚴格來說,如果您使用此解決方案,可能會發生任何事情。
相關問題
- 1. 有沒有辦法避免重複的參數化Jenkins構建?
- 2. 有沒有辦法避免數組到指針的衰減?
- 3. 有沒有辦法避免HibernateOptimisticLockingFailureException?
- 4. 有沒有辦法避免FieldAccessException?
- 5. 有沒有辦法避免使用`end =`
- 6. 有沒有辦法避免neDB集合數組中的條目重複?
- 7. 有沒有辦法避免方法調用重複?
- 8. 有沒有辦法避免Ruby中的重複塊?
- 9. 有沒有辦法避免在bash中的位置參數?
- 10. 有沒有辦法在MySQL數據庫之間複製一個函數?
- 11. 有沒有辦法避免客戶端的javascript方法暴露?
- 12. 有沒有辦法避免Java的awkard對象轉換語法?
- 13. 有沒有辦法在Oracle 10g中的數據庫之間複製BLOB記錄?
- 14. 有沒有辦法避免使用特質時重複類型參數?
- 15. 有沒有辦法避免調用像tabbarcontroller viewdidload方法?
- 16. 有沒有辦法避免有全局變量來實現qsort
- 17. 有沒有辦法強制複製,只複製插入和更新的數據?
- 18. 有沒有辦法避免RTC上的變更集提交?
- 19. 有沒有辦法避免不必要的遞歸?
- 20. 有沒有辦法避免TSQL中的條件?
- 21. 有沒有辦法避免mongodb中的鎖
- 22. 有沒有更好的辦法,以避免使
- 23. 有沒有辦法避免這麼多的鏈表(chain(* list_of_list))?
- 24. 有沒有辦法避免多次配置相同的信息?
- 25. 有沒有辦法避免我在MVC Razor視圖中重複我的代碼?
- 26. 有沒有辦法避免依賴於表達式的linq投影重複?
- 27. 可變參數模板 - 是有辦法避免重複
- 28. 有沒有辦法分片和複製neo4j數據?
- 29. 有沒有辦法在此代碼中避免@SuppressWarnings?
- 30. 有沒有辦法避免使用nobase進行遞歸?
你試圖解決的實際問題是什麼? –
@tomalak:只想處理內部存儲在列表中的大量數據。列表中的每個元素都是數據結構或類。處理過程主要涉及數據結構中數組中所有或某些值的數值計算。希望我這次明確。 – shangping
我完全不理解這個問題。也許我只是很厚。 –