2011-07-05 22 views
1

我在尋找具有以下功能的容器固定尺寸容器:C++與交換元件

  • 在運行時固定大小。因此,內存不應該分成小塊(如std::list那樣)。
  • 元素應該可交換(類似std::list::splice提供)。

編輯:列表 思考:我只是需要從向前方的任意位置移動元素。 編輯2: 我想使用類似std::list的東西,但利用運行時固定大小的優勢。

回答

2

這對我而言並不太清楚你在找什麼。想到兩個解決方案:std::vector(以最大尺寸創建),加上針對您的對象的swap的良好實現或std::list的自定義分配器,該分配器預先分配您在單個塊中需要的節點數。

+0

是的,你說得對。最簡單的方法是使用自定義的「分配器」。 – 0xbadf00d

+1

在這方面,boost有一個專門用於列表的池分配器,可能值得研究。 – Nim

+0

@Nim - 感謝您的建議。我測試了boost :: pool_alloc(獨佔釋放)與自定義實現相比的性能。在適當的情況下,「提升」似乎很好,但在我的情況下,我自己的速度要快得多。 – 0xbadf00d

3

我倒是覺得TR1數組:

std::array<T, int> 

或者,如果你還沒有得到那個呢,

boost::array<T, int> 

這是所有意圖和目的是相同的。當然,元素上std :: swap的有效性取決於合適的拷貝構造函數/賦值運算符的可用性。

+0

'boost :: array '具有編譯時間大小。此外,我想使用類似於列表的東西,因爲我不想複製元素。 – 0xbadf00d

+0

對不起;如果你想減少分配,['std :: vector :: resize'](http://www.cplusplus.com/reference/stl/vector/resize/)是你的朋友。關於不重新分配,有適當的保證,除非需要出現 – sehe

0

您可以在構造時指定std::list的(最初的)尺寸:

std::list<Type> myList = std::list<Type>(10); 

你仍然可以增長/收縮它之後,但該列表將包含從一開始10個默認構造類型的對象。

這是否適合您的需求?

+0

'std :: list'爲我的目的碎片太多了。 – 0xbadf00d

+0

@ FrEEzE2046:然後使用自定義分配器(如其他地方所建議的)可以實現這一點。 –

0

std :: vector?基於數組。基於數組。可以指定大小並具有交換功能。

你還沒有說過你會使用它,所以我不知道你是否會遇到任何速度問題。