2015-07-28 34 views
0

我搜索的東西是std :: vector但沒有大的開銷和多一點比std :: array,因爲與std :: array我沒有存儲的大小(它只能從類型本身知道)。恆定數據與編譯時初始化的容器類

我想要什麼來實現的:寫

與「動態」的容器是這樣的:

std::map< int, std::vector< std::pair<int,int>>>; 

我在運行時不需要修改,但我需要在運行時的大小信息。用std :: array替換std :: vector無法工作,因爲數組必須是所有映射條目的相同大小,這不是我所需要的。

我只!想問一下是否已經有可用的實現。如果答案僅僅是「否」,則不需要建議如何完成這項工作。我只想不再重新發明輪子:-)

背景:我可以在我的小avr控制器上使用stl,但開銷是「有點」到高。因此,我尋找一個符合編譯時間常量表示需求的希望標準實現,其中實現了諸如begin()/ end()和iterator等功能,以滿足最小容器需求,以便使用基於範圍的for和其他。

C++ 14也可用,如果有我搜索的東西。

所有我發現了什麼是完整的模板實現,其中對數據的訪問也是編譯時間常數,如:

container.get<2>() 

,我也不能使用,因爲我需要運行瓦爾訪問我的數據。

編輯:哪些問題/開銷出現在使用的std ::向量:

在使用的std ::矢量我也需要新的/刪除其產生具有的malloc /免費的AVR。我還發現,在avr上,向量本身的初始化本身需要使用每個模板實例的350字節代碼。訪問函數如operator[]以及迭代器都非常小。

+2

'std :: map '沒有意義,關鍵類型/值類型是什麼? – kennytm

+3

你在說什麼「大開銷」? –

+0

@kennytm:修正了這個!謝謝 – Klaus

回答

2

爲了避免std::vector開銷,你可以使用,而不是std::initializer_list

const std::map<int, std::initializer_list<std::pair<int, int>>> 
+0

你能舉一個例子如何使用它? – nwp

+2

我不確定操作是否意識到這不能避免堆分配,我認爲這是他的主要問題。 –

1

不完全清楚我你在尋找什麼,但我想你可以實現你需要以下內容:

  1. 你不知道每個包含的元素的確切大小(說ñ元素),當程序啓動時你會知道它。然後,只要知道容器的大小,只需保留一個連續的內存塊來容納所有容器的所有內部元素。 (一個動態分配)
  2. 使用範圍構建的矢量創建地圖:std::vector(start, end),其中開始和結束通過N個元素的塊計算。
  3. 然後填充地圖。如果你不嚴格需要一張地圖,你也可以計算每個向量的開始和結束的位置,並創建一個包含每個向量位置索引的初始數組...
+0

我也許問了很不清楚。但動態分配正是我不想要的。我用map/vector給出的例子應該用一些可以用於編譯時間分配的類型替換。 – Klaus

0

你所要求似乎是在原則上是不可能的。你說你想避免像類型那樣對你的向量進行堆分配,但是堆棧中的類型的大小必須在編譯時知道,並且對於那種類型的所有成員來說都是一樣的。由於map是一個同類容器,因此值類型必須是具有常數大小的單一類型。你可以用一個元組替換地圖,但是在編譯時必須知道所有的鍵。