基本上,avector
只是一个指向数组的指针,以及它的容量(总分配的内存)和大小(实际使用的元素):
struct vector {
Item* elements;
size_t capacity;
size_t size;
};
当然,由于封装,所有这些都被很好地隐藏了,用户永远无法直接处理血淋淋的细节(重新分配,在需要时调用构造函数/析构函数等)。
至于您关于清除的性能问题,这取决于您如何清除向量:
- 用一个临时的空向量(通常的习惯用法)交换它会删除旧数组:
std::vector<int>().swap(myVector);
- 使用
clear()
orresize(0)
将擦除所有项目并保持分配的内存和容量不变。
如果您关心效率,恕我直言,要考虑的要点是reserve()
提前调用(如果可以的话),以便预先分配数组并避免无用的重新分配和复制(或使用 C++11 移动)。当向向量添加大量项目时,这可能会产生很大的不同(众所周知,动态分配的成本非常高,因此减少它可以大大提高性能)。
关于这一点还有很多话要说,但我相信我已经涵盖了基本细节。不要犹豫,询问您是否需要有关特定点的更多信息。
关于地图,它们通常使用红黑树来实现。但是该标准并没有强制要求,它只给出了功能和复杂性要求,因此任何其他符合要求的数据结构都可以使用。我不得不承认,我不知道 RB 树是如何实现的,但我猜想,映射至少包含一个指针和一个大小。
当然,每种容器类型都是不同的(例如,无序映射通常是哈希表)。