环形队列(环形队列c++实现)

环形队列(环形队列c++实现)p 在 C CX 程式中 您可以自由使用標準範本程式庫 STL 容器 或任何其他使用者定義的集合類型 但是 當您在 Windows 執行階段應用程式二進位介面 ABI 之間來回傳遞集合時 例如 傳遞到 XAML 控制或 JavaScript 用戶端 您必須使用 Windows 執行階段集合類型 p

大家好,我是讯享网,很高兴认识大家。



 </nav><p>在C++/CX 程式中,您可以自由使用標準範本程式庫 (STL) 容器,或任何其他使用者定義的集合類型。 但是,當您在 Windows 執行階段應用程式二進位介面 (ABI) 之間來回傳遞集合時 (例如,傳遞到 XAML 控制或 JavaScript 用戶端),您必須使用 Windows 執行階段集合類型。</p> 

讯享网

Windows 執行階段會定義集合和相關類型的介面,C++/CX 會在collection.h 標頭檔中提供具體 C++實作。 下圖顯示集合型別之間的關聯性:

集合類型的 C++ C X 繼承樹狀結構的圖表。
讯享网

  • Platform::Collections::Vector 類別 與 std::vector 類別類似。
  • Platform::Collections::Map 類別 與 std::map 類別類似。
  • Platform::Collections::VectorView 類別和 Platform::Collections::MapView 類別是 和 的唯讀版本。
  • 迭代器在 Platform::Collections 命名空間中定義。 這些迭代器可以滿足 STL 迭代器的需求,並且可讓您針對任何 Windows::Foundation::Collections介面類型或 Platform::Collections具象類型使用 std::find 、 std::count_if 和其他 STL 演算法。 例如,這表示您可以逐一查看以 C# 建立的 Windows 執行階段元件中的集合,並套用 STL 演算法。

  • C++/CX 集合類型支援 STL 容器支援的相同執行緒安全性保證。
  • Windows::Foundation::Collections::IObservableVector 和 Windows::Foundation::Collections::IObservableMap 會定義只要集合變更 (無論變更方式為何) 就會觸發的事件。 藉由實作這些介面,就能讓 Platform::Collections::Map 和 Platform::Collections::Vector 與 XAML 集合進行資料繫結。 例如,如果您具有資料繫結至 的 ,當您將項目加入至集合時,此變更會反映在 Grid UI。

當您的類別必須將序列容器傳遞至另一個 Windows 執行階段元件時,請使用 Windows::Foundation::Collections:: IVector<T> 做為參數或傳回型別,而 Platform::Collections::Vector<T> 做為具體實作。 如果您嘗試在公用傳回值或參數中使用 類型,則會引發編譯器錯誤 C3986。 只要將 變更為 ,就可以修正這個錯誤。

提供在集合中新增、移除和存取項目的必要方法,此集合可隱含轉換為 。 您也可以在 的執行個體上使用 STL 演算法。 下列範例示範一些基本用法。 這裡的 begin 函式 和 end 函式 來自 命名空間,而非 命名空間。

讯享网

如果您有現有使用 的程式碼,而您想要在 Windows 執行階段元件中重複使用它,請使用其中一個 建構函式,當您透過 ABI 傳遞集合時,此建構函式接受 或一組迭代器來建構 。 下列範例示範如何從 使用 移動建構函式,以提高初始化效率。 在移動作業後,原始 變數就不再有效。

 

如果您必須在未來透過 ABI 傳遞字串向量,您必須決定最初以 型別或 型別建立字串。 如果您必須對字串進行許多處理,則使用 。 否則,請以 類型建立字串,以避免稍後進行轉換的成本。 您也必須決定是否要將這些字串放入 或 內部。 一般的作法是,只有在您透過 ABI 傳遞容器時,才使用 ,然後從中建立 。

要儲存在 Platform::Collections::Vector 中的所有元素都必須隱含或透過您提供的自訂 std::equal_to 比較子支援相等比較。 所有參考型別及所有純量型別都隱含支援相等比較。 針對非純量實值類型 (例如 Windows::Foundation::DateTime) 或自訂比較 (例如 ),您必須提供自訂函式物件。

Platform::Collections::VectorIterator 和 Platform::Collections::VectorViewIterator 可讓您搭配 IVector<T> 容器使用 迴圈和 std::sort 等演算法。 但是,您無法透過 C++ 指標取值存取 項目,只能透過 GetAt 和 SetAt 方法存取。 因此,基於「標準程式庫」的要求,這些迭代器會使用 Proxy 類別 和 透過 *>[] 運算子存取個別元素。 嚴格來說,如果指定 ,則 的類型就是 。 不過,對您的程式碼來說,Proxy 物件永遠都像是不存在一樣。 這些 Proxy 物件沒有記錄在文件中,因為它們僅供迭代器在內部使用,但是了解機制如何運作還是很重要。

當您針對 容器使用基於範圍的 迴圈時,請使用 讓迭代器變數能夠正確繫結至 元素。 如果您使用 ,就會引發編譯器警告 C4239,而且警告文字中會提及 。

下圖顯示針對 執行的 迴圈。 請注意,程式會執行到第 64 行的中斷點停止。 [ 快速監看式 ] 視窗會顯示迭代器變數 就是擁有 和 成員變數的 。 但是,當您針對這個變數呼叫 時,它會將相同的類型傳回給 執行個體 。 因此,雖然 和 可能會出現在 [ 快速監看式]、偵錯工具、某些編譯器錯誤或其他位置,但是一般而言,您仍然不必明確為它們撰寫程式碼。

在以 for 迴圈為基礎的範圍內偵錯 VectorProxy 的螢幕擷取畫面。

有一種情況下您必須為 Proxy 物件撰寫程式碼,就是必須針對元素執行 的時候 (例如,當您在 項目集合中尋找特定類型的 XAML 物件時)。 在這種情況下,您必須先將這個項目轉換為 Platform::Object^,然後再執行動態轉換:

讯享网

這個範例示範如何插入項目及在 Platform::Collections::Map中查閱項目,然後傳回 作為唯讀 Windows::Foundation::Collections::IMapView 類型。

 

一般而言,基於效能考量,在內部對應功能上最好使用 型別。 如果您必須透過 ABI 傳遞容器,請從 std::map 建構 Platform::Collections::Map ,然後傳回 作為 Windows::Foundation::Collections::IMap。 如果您嘗試在公用傳回值或參數中使用 類型,則會引發編譯器錯誤 C3986。 只要將 變更為 ,就可以修正這個錯誤。 在某些情況下,例如,如果不是進行大量搜尋或插入,且您經常透過 ABI 傳遞集合,則一開始便使用 可耗費較少資源,還能避免轉換 時的成本。 在任何情況下,請避免在 上執行查閱和插入作業,因為這些是效能最低的三個類型。 只有在透過 ABI 傳遞容器時,才應該轉換為 。

在 Platform::Collections::Map 中的項目已排序。 要儲存在 中的所有項目都必須隱含或透過您提供的自訂 stl::less 比較子,支援使用嚴格弱式順序的小於比較。 純量類型隱含支援此比較。 針對非純量實值類型 (例如 ) 或自訂比較 (例如 ),您必須提供自訂比較子。

集合分成四種分類:序列集合和關聯集合的可修改版本和唯讀版本。 此外,C++/CX 提供三個迭代器類別來簡化集合的存取,藉此增強集合。

您可以變更可修改的集合的元素,但只能讀取唯讀集合的元素,又稱為 檢視 (View)。 Platform::Collections::Vector 或 Platform::Collections::VectorView 集合的元素,可以使用迭代器或該集合的 Vector::GetAt 和索引來存取。 您可以使用集合的 Map::Lookup 和索引鍵來存取關聯集合的元素。

和 以 為樣板,因此,您可以自訂比較子。 此外, 和 以 為樣板,因此,您可以自訂 的行為。 這對於值結構的 和 而言十分重要。 例如,若要建立向量 <Windows::Foundation::DateTime>,您必須提供自訂比較子,因為 DateTime 不會多載 == 運算子。

為了簡化 STL 來處理 、、、,和任意 物件的用法,C++/CX 支援 begin Function 和 end Function 非成員函式的多載。

下表列出可用的迭代器和函式。

迭代器 函式 Platform::Collections::VectorIterator<T>

(內部存放區 Windows::Foundation::Collections:: IVector<T> 和 int。)

begin/ end(Windows::Foundation::Collections:: IVector<T>) Platform::Collections::VectorViewIterator<T>

(內部存放區 IVectorView<T>^ 和 int。)

begin/ end (IVectorView<T>^) Platform::Collections::InputIterator<T>

(內部存放區 IIterator<T>^ 和 T。)

begin/ end (IIterable<T>) Platform::Collections::InputIterator<IKeyValuePair<K, V>^>

(內部存放區 IIterator<T>^ 和 T。)

begin/ end (IMap<K,V>。 Platform::Collections::InputIterator<IKeyValuePair<K, V>^>

(內部存放區 IIterator<T>^ 和 T。)

begin/ end (Windows::Foundation::Collections::IMapView)



















和 藉由實作變更或重設集合物件時,或者插入、移除或變更集合的任何元素時所發生的事件,來支援 XAML 集合中的資料繫結。 您可以撰寫自己的型別來支援資料繫結,但是您無法繼承自 或 ,因為這些型別是密封型別。

Windows::Foundation::Collections::VectorChangedEventHandler 和 Windows::Foundation::Collections::MapChangedEventHandler 委派會為集合變更事件的事件處理常式指定簽章。 Windows::Foundation::Collections::CollectionChange 公用列舉類別及 和 ref 類別會儲存事件引數,以判斷造成事件的原因。 類型在 命名空間中定義,因為當您使用 或 時,不需要明確建構或使用這些類型。


小讯
上一篇 2025-06-12 14:53
下一篇 2025-06-06 18:02

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/208274.html