這更像是一個禮儀問題,但在創建新陣列時,我應該使用什么值(零以外的值)來表示陣列中的空白空間?例如:
int* arr;
arr = new int[10];
當我像上面的代碼一樣創建一個新陣列時,該陣列將填充十個零。我遇到的問題是我想在列印陣列時使用下劃線來指示空格,但是,我也將零作為陣列中資料集的一部分。那么,我是否應該只用一些不太可能出現在我的資料集中的任意值填充空陣列(like -32000 for example),并將其用作空白空間的指示器,或者是否有某種我可以使用的空值,以便我可以知道一個事實,即該特定索引處的值肯定是一個空白空間嗎?
uj5u.com熱心網友回復:
你似乎在問什么叫做哨兵——一些具有特殊含義的資料值。
關于哨兵的選擇,使用你知道不會出現的東西,并使其成為命名常量。例如,您可以使用:
constexpr int NoValue = std::numeric_limits<int>::min();
如果您絕對需要整個整數范圍,或者如果您不能可靠地清理您的輸入以確保資料永遠不會被接受為非空值,請考慮使用可以表示該范圍和標記的更大資料型別,或std::optional按照建議使用另一個答案。
或者,維護一個單獨的陣列來保存該資訊。這樣的陣列只需要每個元素一位來表示該值是否為空,因此它僅意味著存盤的小幅增加,而不是將您的資料型別擴展到int. 這種方法在記憶體使用與記憶體區域性之間進行權衡,因為有關“空”的資料不會存盤在陣列中的值附近,這可能會對快取產生影響。
關于實際的初始化問題:您的陣列未初始化,需要使用std::fill或類似的設定值。否則,如果您嘗試使用未初始化的值,則程式的行為是未定義的。請注意,有一種特殊情況:new int[100]()它將對記憶體進行零初始化。但是您不能使用該構造用任何其他值進行初始化。
考慮使用std::vector以避免記憶體管理問題,并在不增加代碼混亂的情況下提供非零值的初始化:
std::vector<int> arr(10, NoValue);
如您所見,可以根據程式的要求及其輸入規范進行選擇。我希望這有助于您做出更明智的決定。
uj5u.com熱心網友回復:
我應該用一些不太可能出現在我的資料集中的任意值填充空陣列嗎
好吧,不太可能與您確定不會出現在資料中的值不同,并且您因錯誤而導致的錯誤將是一個令人討厭的錯誤。但是,一般來說,您通常對有效值的范圍有一些了解,并且使用該范圍之外的標記值來指示無效確實更容易。(如果你這樣做,我建議你對進入你程式的輸入資料非常挑剔,即明確測驗你的哨兵值意外來自外部來源。)
但是,在沒有這樣的值的情況下,或者只是明確地宣告您的意圖,在現代 C 中處理這種情況的規范方法是使用std::optional<int>. 標準庫optional是一種將任何型別轉換為可空型別的方法。
uj5u.com熱心網友回復:
請注意,StackOverflow 中通常不贊成“品味”問題。
話雖如此,這是我的偏好:
不能偽裝成有效值的東西,如 NaN,是一個很好的占位符。如果這不是一個選項,那么正如您所說,一個不會/不允許出現在資料集中的值有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376889.html
上一篇:放置一個不能默認構造的不可移動物件的std::array
下一篇:為什么使用cin函式會給我錯誤?
