我在尋找具有以下功能的容器固定尺寸容器:C++與交換元件
- 在運行時固定大小。因此,內存不應該分成小塊(如
std::list
那樣)。 - 元素應該可交換(類似
std::list::splice
提供)。
編輯:列表 思考:我只是需要從向前方的任意位置移動元素。 編輯2: 我想使用類似std::list
的東西,但利用運行時固定大小的優勢。
我在尋找具有以下功能的容器固定尺寸容器:C++與交換元件
std::list
那樣)。std::list::splice
提供)。編輯:列表 思考:我只是需要從向前方的任意位置移動元素。 編輯2: 我想使用類似std::list
的東西,但利用運行時固定大小的優勢。
這對我而言並不太清楚你在找什麼。想到兩個解決方案:std::vector
(以最大尺寸創建),加上針對您的對象的swap
的良好實現或std::list
的自定義分配器,該分配器預先分配您在單個塊中需要的節點數。
我倒是覺得TR1數組:
std::array<T, int>
或者,如果你還沒有得到那個呢,
boost::array<T, int>
這是所有意圖和目的是相同的。當然,元素上std :: swap的有效性取決於合適的拷貝構造函數/賦值運算符的可用性。
您可以在構造時指定std::list
的(最初的)尺寸:
std::list<Type> myList = std::list<Type>(10);
你仍然可以增長/收縮它之後,但該列表將包含從一開始10個默認構造類型的對象。
這是否適合您的需求?
'std :: list'爲我的目的碎片太多了。 – 0xbadf00d
@ FrEEzE2046:然後使用自定義分配器(如其他地方所建議的)可以實現這一點。 –
std :: vector?基於數組。基於數組。可以指定大小並具有交換功能。
你還沒有說過你會使用它,所以我不知道你是否會遇到任何速度問題。
是的,你說得對。最簡單的方法是使用自定義的「分配器」。 – 0xbadf00d
在這方面,boost有一個專門用於列表的池分配器,可能值得研究。 – Nim
@Nim - 感謝您的建議。我測試了boost :: pool_alloc(獨佔釋放)與自定義實現相比的性能。在適當的情況下,「提升」似乎很好,但在我的情況下,我自己的速度要快得多。 – 0xbadf00d