vector
vector本质是能够动态扩容的数组
vector基类_vector_base里有一个结构体vector_impl_data,里边保存了start、finish、end_of_storage三个指针,分别指向vector使用开始位置、结束位置、整个vector申请内存空间的结束位置
__M_end_of_storage是C++ STL中vector容器的一个数据成员,它表示vector实际分配的内存空间的尾端位置。这个数据成员是一个指针,指向vector内部连续存储空间的最后一个元素的下一个位置。vector通过维护三个指针(或迭代器)来管理其内部数据:
_M_start:指向vector当前使用的第一个元素的地址。
_M_finish:指向vector当前使用的最后一个元素的下一个位置。
_M_end_of_storage:指向vector实际分配的内存空间的尾端位置。
当vector需要增长时,它可能会重新分配内存并复制现有数据到新的内存空间,此时_M_start和_M_finish会更新以指向新的内存区域,而_M_end_of_storage则保持不变,除非进行内存的重新分配。这种设计使得vector能够在需要时动态扩展其容量,同时保持对已有数据的引用有效性(只要不进行导致空间重新分配的操作)。
此外,通过比较_M_finish和_M_end_of_storage的位置,可以判断vector是否还有足够的空间来存储新的元素。如果_M_finish等于_M_end_of_storage,则表示vector已经满了,无法再添加新元素而不进行内存的重新分配。否则,可以在当前分配的内存空间内继续添加元素
/usr/include/c++/10/bits/stl_vector.h
1 | /** |
1 | /** Returns the number of elements in the %vector. */ |
1 | /** |
reserve
通过reserve提前分配内存,避免频繁扩容。
1 | #include <vector> |
1 | ubuntu@ubuntu-ThinkCentre-M800t-1N000:~/learn$ g++ vec.cpp |
insert
1 | // inserting into a vector |
Output:
1 | myvector contains: 501 502 503 300 300 400 400 200 100 100 100 |
erase
1 | // erasing from vector |
Output:
1 | myvector contains: 4 5 7 8 9 10 |
list
1 | // [23.2.2.2] capacity |
1 | // Supporting structures are split into common and templated |
1 | /** |