回答
它们根本不同。虽然您可以同时执行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. 填充二维矢量C++
- 3. 二维矢量的push_back
- 4. C++中的二维矢量
- 5. 设置的二维矢量
- 6. 二维矢量迭代器
- 7. XNA矢量的减法和op_Subtraction有什么区别?
- 8. 查找二维矢量的总和
- 9. 二维矢量增量错误
- 10. 2维矢量
- 11. 什么是矢量图?
- 12. 在Android中使用矢量绘图和一组.png图标有什么区别?
- 13. 初始化矢量矢量(外部矢量和内部矢量)
- 14. 什么是矢量?
- 15. 各种助推ublas稀疏矢量之间有什么区别?
- 16. C++ 5维矢量?
- 17. 什么是矢量长度和矢量缓存大小?
- 18. 在C#中有效地从二维数组中提取矢量
- 19. 在C++中boost :: variant的二维矢量
- 20. 如何动态调整二维矢量?
- 21. C++二维矢量语法错误
- 22. 计算二维矢量的交叉积
- 23. C++二维矢量SIGSEV错误
- 24. 二维欧几里德矢量旋转
- 25. 读取二维矢量的值
- 26. 二维STL矢量线程安全吗?
- 27. 从二维数组转换为矢量
- 28. numpy的:切片和矢量与一维和二维数组
- 29. 矢量矢量C++
- 30. push_back矢量矢量
map是一个关联容器,而vector不是。 –