deque 容器

deque 容器的空间不用手动收缩,类内部会自动处理

January 16, 2022 · 1 min · Rick Cui

巧妙收缩 vector 空间

resize() 或者 erase() 后 vector 的空间大小不会自动减小 int main() { vector<int> v; for(int i = 0; i < 100000; ++i){ v.push_back(i); } cout << "size: " << v.size() << endl; cout << "capacity: " << v.capacity() << endl; cout << "-----------------------" << endl; v.resize(10); cout << "size: " << v.size() << endl; cout << "capacity: " << v.capacity() << endl; cout << "-----------------------" << endl; vector<int>(v).swap(v); cout << "size: " << v....

January 16, 2022 · 1 min · Rick Cui

vector 中的元素存放在堆上还是栈上

结论 allocator 分配器是定义内存模型的类,用于标准库的某些部分,尤其是 STL 容器,如果所有标准容器的最后一个(可选)模板参数没有指定,那么它将使用这个分配器,并且它是标准库中唯一一个预定义的分配器 vector 中存放的如果是对象类型,则会通过 allocator 在堆上开辟足够的空间来存放和管理集合中的对象 vector 中存放指针类型,一定要记得手动释放内存 存放对象 class Person{ public: Person(int age, int id){ m_age = age; m_id = id; cout << "Person(int, int)..." << endl; } Person(const Person& p){ m_age = p.m_age; m_id = p.m_id; cout << "Person(const Person& p)..." << endl; } ~Person(){ cout << "~Person()..." << endl; } void* operator new(size_t size){ void* p = malloc(size); cout << "new()..." << endl; return p; } void operator delete(void *p){ cout << "delete()....

January 16, 2022 · 3 min · Rick Cui

STL Hello World

平时要有容器、算法、迭代器的思维模式 容器提供迭代器,算法使用迭代器 // 算法 int count(int* begin, int* end, int val){ int n = 0; while(begin != end){ if(*begin == val){ n++; } begin++; } return n; } int main() { // 容器 int arr[] = {1, 3, 0, 5, 1, 3, 1, 0}; // 迭代器 int* begin = arr; int* end = *(&arr + 1); int n = count(begin, end, 1); cout << "count: " << n << endl; return 0; }

January 16, 2022 · 1 min · Rick Cui

STL 总结

1、六大组件介绍 容器:数据结构,用来存放数据 算法:常用算法 迭代器:容器和算法之间的胶合剂,“范型指针” 仿函数:一种重载了operator()的类,使得这个类的使用看上去像一个函数 配置器:为容器分配并管理内存 适配器:修改其他组件接口 2、STL 常用的容器有哪些以及各自的特点是什么? 名称 特点 vector 底层数据结构为数组,支持快速随机访问 list 底层数据结构为双向链表,支持快速增删 deque 底层数据结构为一个中央控制器和多个缓冲区,支持首尾(中间不能)快速增删,也支持随机访问 stack 底层一般用deque/list实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时 queue 底层一般用deque/list实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时 priority_queue 底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现 set 底层数据结构为红黑树,有序,不重复 multiset 底层数据结构为红黑树,有序,可重复 map 底层数据结构为红黑树,有序,不重复 multimap 底层数据结构为红黑树,有序,可重复 unordered_set 底层数据结构为hash表,无序,不重复 unordered_multiset 底层数据结构为hash表,无序,可重复 unordered_map 底层数据结构为hash表,无序,不重复 unordered_multimap 底层数据结构为hash表,无序,可重复 3、vector 和 list 的区别 vector底层实现是数组,所以在内存中是连续存放的,随机读取效率高,但插入、删除效率低;list底层实现是双向链表,所以在内存中是任意存放的,插入、删除效率高,但访问元素效率低 vector在中间节点进行插入、删除会导致内存拷贝,而list不会 vector一次性分配好内存,不够时才进行2倍扩容;list每次插入新节点都会进行内存申请 4、vector 扩容原理 以原内存空间大小的两倍配置一份新的内存空间,并将原空间数据拷贝过来进行初始化...

December 30, 2021 · 1 min · Rick Cui