我想要一個包含回傳可迭代物件(容器?)的方法的虛擬基類(介面)。實作類將各自處理它們的容器,例如,類 A 將容器實作為向量,類 B 將實作為串列等。
本質上,我想做這樣的事情:
class Base{
virtual Container getContainer() = 0;
}
class A:Base{
Vector v;
Container getContainer() {return v;}
}
A a;
Iterator begin = a.getContainer().begin;
Iterator end = a.getContainer().end;
如在,呼叫者將負責處理迭代器(例如呼叫開始和結束函式進行迭代)
我認為這樣的事情是可能的,但我不知道如何去做。具體來說,我假設像 vector 和 list 這樣的類從定義方法begin()和的公共介面繼承end(),但我無法弄清楚該介面是什么,以及如何處理它。
uj5u.com熱心網友回復:
查看 cppreference.com。這個通用介面只是一個約定和一些規則,并不是真正的C 型別。所以不,你不能多型地使用容器。原因很簡單,就是效率,運行時多型會降低性能。更詳細的洞察,有很多關于STL背后的設計思想的檔案,里面都有體現。
如果你真的想實作這一點,你不僅需要圍繞 STL 樣式的序列容器(雙端佇列、向量、串列、陣列)的包裝類,還需要圍繞迭代器。迭代器通常硬系結到容器,因此這種連接。包裝類也將提供你會找到各種方法的基本容器中,例如像begin(),end(),size()等等。
請注意,并非每個容器都支持所有方法。例如,有些不支持push_front()但只支持push_back(). 它們都有begin()and end(),但單向鏈表(目前不是 C 的一部分)不能有rbegin()and rend()。您可以將這些類別分類為單獨的純虛擬基類。
總的來說,我懷疑這是否有用。如果您想交換實作,請設計您的代碼,使容器成為它的模板引數。然后在編譯時決議所有呼叫,從而減少代碼、減少記憶體需求和提高性能。
uj5u.com熱心網友回復:
容器不是多型的。沒有通用的基類。迭代器也是如此。
這是有意為之,因為當通過基于虛擬方法的介面完成時,逐個元素的迭代結果證明是非常低效的。它可以完成,但速度很慢。
Boost 有任何范圍和任何迭代器,或者您可以推出自己的 vis 型別擦除技術。我建議不要這樣做。
獲得迭代多型的最簡單和最便宜的方法是添加一個foreach_element(std::function<void(Element const&)>)const方法。您可以使用 來批量迭代以減少開銷foreach_element(std::function<void(std::span<Element const>)>)const,從而允許容器將元素聚集在一起。這比完全多型的迭代器和容器更容易撰寫并且速度更快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/369638.html
