2013-03-08 31 views
2

我們拿到的這款地圖:逼退了地圖容器

std::map <int, int> values; 

將這個功能是相同的一個載體的的push_back功能:

void PushBack(int value) 
{ 
    values[values.size()] = value; 
} 

因爲尺寸返回容器的大小我認爲這是正確的,根據以下情況它是: 索引0 = 200 索引1 = 150 你想推回100,values.size()會返回2,對不對?那麼,它就像正常的push_back進入索引2一樣,是否正確?

+1

'values [values.size()]'會給你一個運行時錯誤,因爲你正在添加一個** **過去**容器的末尾。 – 2013-03-08 13:56:40

+0

如果您想要順序存儲使用矢量。將地圖用作矢量沒有任何優勢。 – andre 2013-03-08 13:57:44

+1

@ bash.d不,''values'是一張地圖。其運算符'[]'如果該鍵不存在則創建一個條目。 – Angew 2013-03-08 13:57:57

回答

7

地圖的要點是根據唯一表示數據的關鍵字來查找和存儲數據。

如果你這樣做,使用地圖沒有意義;你應該選擇另一個更適合應用程序設計需求的數據結構。

+1

+1,'std :: vector'和'std :: map'存在不同的目的,在它們有意義的地方使用它們。 – 2013-03-08 13:57:52

1

除非您僅以非常特殊的方式使用地圖,否則它將不正確。考慮這種情況:

values現在擁有一個元素,7,在指數1

問題是,當然,如果你需要「推回」,爲什麼首先使用地圖。

0

如果你想要push_back然後考慮使用std::vector。一個map是一個關聯數組,可以通過指定類型的鍵快速查找。它們不是設計成像vector一樣做push_back。

0

很難說你想實現什麼,以及爲什麼你嘗試使用地圖,而不是載體,但更好的方法可能是:

void PushBack(int value) 
{ 
    int idx = 0; 
    if(values.size()) idx = values.rbegin()->first + 1; 
    values[idx] = value; 
} 
2

地圖和矢量有很大的不同。

短版到你問的實際問題:

,如果你自定義的地圖上做的是已經存在的密鑰的基於密鑰的查找(運營商[])和您的push_back可能像一個效率低下的替代矢量,你只使用向量運算符[]和push_back,是的。

長版本提供,爲什麼你在做什麼,一些背景可能不是真正你想要什麼:

的地圖沒有一個指標,它有一個關鍵。地圖通常以紅黑樹的形式實現。這樣的數據結構允許基於密鑰進行有效的查找。您通常關心某個特定元素的關鍵,而關鍵本身則包含重要信息。密鑰通常不是連續的,並且地圖不會爲映射中未使用的密鑰分配空間。

一個向量是一個連續的內存塊。這允許有效的索引訪問。索引與鍵不同:您通常不關心某個特定元素獲得哪個索引,您獲得的索引取決於插入順序(它們的鍵值與地圖中的插入順序無關),索引到矢量中始終是整數值,並且不能有非連續的索引。

如果您在映射中所做的所有操作都是您自己的自定義push_back,那麼在外部它可能在某些情況下看起來像一個向量,並且在其他情況下(例如迭代器失效)可能不會如此。

由於您實際上並不關心在您的示例中添加的元素的關鍵點,所以地圖的選擇毫無意義。向量中的索引查找速度會更快,並且內存開銷會更小(儘管如果分配了很多對象,最終會導致內存碎片問題,但這是一個單獨的主題)。

最後,如果您不知道要使用哪個容器類,則需要使用向量和列表。理解這兩者之間的差異,以及何時應該使用它們中的任何一個,然後轉向更高級的專用容器,如map,set,它們的「多個」變體以及它們的「無序」變體。

+0

+1 - 非常詳細的答案:) – 2013-03-08 14:50:22