簡體   English   中英

將C ++數組指針的一個結尾轉換為交互器是否合法?

[英]Is it legal to convert a one past end of C++ array pointer into an interator?

我有這個代碼:

#include <set>

int main() {
    int array[] = { 0 };
    std::set<int> stdset(&array[1], &array[1]);
}

它獲取超出最后一個數組元素的元素的地址並將其轉換為迭代器。 基本上與std::vector::end()作用相同。

這樣做是合法的:

 std::vector<int> vec;
 std::set<int> stdset(vec.end(), vec.end());

因為“最后”迭代器是一個非包含限制。

使用原始數組和第一個代碼片段一樣合法嗎?

你可以在C ++中獲取任何數組的一個接一個的結尾地址。

你不能dereferrence並使用結果,但你可以將它與同一陣列的其他指針和同一陣列的其他一個結尾進行比較。

你在OP中做的是定義的行為,並代表一個空的范圍。

沒有涉及轉換。 指針支持與隨機訪問迭代器(一元*運算符, +++運算符等)相同的操作,因此可以用作迭代器。 采用迭代器的標准庫函數是根據迭代器的類型進行模板化的,因此它們將獲取指針而不將其轉換為任何東西。

這一點,以及指向一個超過數組末尾的指針有效的事實(只要你不取消引用它),意味着你的代碼是正確的。

你沒有轉換任何東西:指針有效的迭代器而不是向量。

獲取指向數組末尾的元素是合法的,但取消引用這樣的指針是不合法的。

ANSI C,第5.7段第5段:

當向指針添加或從指針中減去具有整數類型的表達式時,結果具有指針操作數的類型。 如果指針操作數指向數組對象的元素,並且數組足夠大,則結果指向偏離原始元素的元素,使得結果元素和原始數組元素的下標的差異等於整數表達式。 換句話說,如果表達式P指向數組對象的第i個元素,則表達式(P)+ N(等效地,N +(P))和(P)-N(其中N具有值n)指向分別為數組對象的第i + n和第i-n個元素,只要它們存在。 此外,如果表達式P指向數組對象的最后一個元素,則表達式(P)+1指向一個超過數組對象的最后一個元素,如果表達式Q指向一個超過數組對象的最后一個元素,表達式(Q)-1指向數組對象的最后一個元素。 如果指針操作數和結果都指向同一個數組對象的元素,或者指向數組對象的最后一個元素,則評估不應產生溢出; 否則,行為未定。

我沒有在網上找到C ++標准引用中的引用,我沒有C ++標准的副本,所以我無法證明它仍然是關於C ++的最新版本,但它可能是。

TL; DR:您的代碼是合法的。

說實話,我根據任何規格都不知道你問題的答案。 然而,我在您的方法中看到的問題是,您正在將實現與您正在使用的庫中的實現細節聯系起來。

如果將實現綁定到您使用的庫所公開的接口,那么如果這些庫的實現發生更改,則消耗代碼的可能性就會降低。 在這種特殊情況下,這可能不是很相關,因為數組的內存布局在不久的將來不太可能改變,但如果確實如此,運行時庫開發人員也可能相應地改變迭代函數的實現,所以如果如果使用公開的函數,您的代碼應該按預期繼續工作。 但是,如果您的代碼依賴於庫的實現細節,那么您可能需要完成所有案例使用並相應地更改它們。

編輯:

對不起,我不認為我表達得很清楚; 我不是在談論你的代碼,而是談論你的方法。 封裝的一個好處是它允許編寫代碼組件,每個代碼組件都是自己的任務,然后通過組合多個代碼組件提供的功能來完成應用程序。 具有多個抽象級別使我們能夠設計較高級別而無需擔心較低級別的微小細節。

如果構成整個應用程序的不同組件與彼此的實現細節保持隔離,則組件可以輕松升級而不會破壞兼容性,只要組件保持其最小接口並且其實現行為正確即可。 如果不同組件彼此相互依賴,則升級變得更加困難,因為需要根據所涉及組件的內部結構進行更改; 在較低級別的組件中看似無害的修改(比如在兩個較舊的組件之間插入一個新的成員變量)可能會在完全不相關的代碼片段中“巧妙地”依賴於組件的內部結構而產生完全不可預見的后果。

在編程領域,您可以使用您找到的任何資源將輸入轉換為輸出,但這並不意味着所有可能性都具有相同的含義。 如果您擔心執行時間並且調用函數的開銷是不可接受的,那么您可以通過完全跳過面向對象的方法並通過索引迭代數組來獲得一些額外的周期。 如果執行時間不是那么關鍵,它允許在接口上調用公共方法,那么通過使用它,您將獲得更小的升級噩夢。

暫無
暫無

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

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