回答
它們根本不同。雖然您可以同時執行g2[0]
和g1[0]
,但行爲卻大不相同。假設索引0處沒有任何內容,那麼std::map
將默認構造一個新的value_type,在這種情況下是一個向量,並返回一個引用,而std::vector
具有未定義的行爲,但通常是段錯誤或返回垃圾。
它們在內存佈局方面也完全不同。儘管std::map
由紅黑樹支持,但std::vector
在內存中是連續的。因此插入到映射中總是會導致內存中某處的動態分配,而向量將在其當前容量超過的情況下調整大小。但請注意,矢量矢量在內存中不是連續的。第一矢量,它本身是在存儲器中連續由載體看起來大致是這樣的在數據方面組成:
struct vector
{
T* data;
size_t capacity;
size_t size;
};
這裏每個矢量的擁有在data
其動態存儲器分配。
該地圖的優點是不必密集填充,即可以在索引0和12902處沒有所有東西之間的東西,再加上它被排序。如果你不需要排序的屬性,並且可以使用C++ 11,請考慮std::unordered_map
。矢量總是密集填充的,即在大小10000處,元素0-9999存在。
的相似性是訪問數據的方式,也可以是相同的語法:
std::cout << g1[3][2] << std::endl;
std::cout << g2[3][2] << std::endl;
的主要區別如下:矢量的地圖沒有包含所有的索引。然後,你可以有,如例子中,只有3地圖中的向量與鍵「17」,「1234」和13579
訪問:
g2[17].resize(10);
g2[1234].resize(5);
g2[13579].resize(100);
如果你想與向量的矢量相同的語法,你需要你的主向量中至少有13579個向量(包括13576個空向量)。但是這會在內存中使用很多未使用的空間。
另外,在映射圖,也可以用負密鑰訪問自己的載體(這是不可能以向量爲向量):
g2[-10].resize(10);
這明顯高差後,數據的存儲是不同。矢量分配連續的內存,而地圖以樹的形式存儲。向量中訪問的複雜度爲O(1)
,而在地圖中則爲O(log(n))
。我邀請您學習一些關於C++中的容器的教程,以瞭解所有差異以及使用它們的常用方法。
用例子你可以理解它們之間的區別。假設vector<int>
存儲唯一的ID號碼,並且map
將各自的PIN碼存儲爲密鑰。
map< int , vector<int> > listOfPeopleAtRespectivePinCode;
vector< vector<int> > bunchOfGroupsOfPeople;
顯然,map
能夠關聯鍵和值(這裏爲值列表),而vector
可以有效地存儲一組數據。
- 1. 二維矢量
- 2. 矢量矢量有什麼問題?
- 3. 二維矢量迭代器
- 4. 設置的二維矢量
- 5. C++中的二維矢量
- 6. 二維矢量的push_back
- 7. 填充二維矢量C++
- 8. 二維搜索二維矢量
- 9. XNA矢量的減法和op_Subtraction有什麼區別?
- 10. 查找二維矢量的總和
- 11. 二維矢量增量錯誤
- 12. 2維矢量
- 13. 什麼是圖像矢量?
- 14. 什麼是矢量圖?
- 15. 在Android中使用矢量繪圖和一組.png圖標有什麼區別?
- 16. 初始化矢量矢量(外部矢量和內部矢量)
- 17. 帶整數鍵和矢量的地圖之間的區別
- 18. 什麼是矢量?
- 19. 各種助推ublas稀疏矢量之間有什麼區別?
- 20. C++ 5維矢量?
- 21. 什麼是矢量長度和矢量緩存大小?
- 22. 什麼是矢量和矢量<>之間的differenece
- 23. 在C#中有效地從二維數組中提取矢量
- 24. 計算二維矢量的偏航
- 25. 分裂TCHAR成二維矢量
- 26. 讀取二維矢量的值
- 27. 二維遊戲矢量運動C#
- 28. 二維矢量類型轉換
- 29. 二維STL矢量線程安全嗎?
- 30. 在C++中boost :: variant的二維矢量
map是一個關聯容器,而vector不是。 –