如何避免vector容器进行不必要的扩容?
发布时间:2020-12-16 07:36:21 所属栏目:百科 来源:网络整理
导读:前面提到,我们可以将 vector 容器看做是一个动态数组。换句话说,在不超出 vector 最大容量限制(max_size() 成员方法的返回值)的前提下,该类型容器可以自行扩充容量来满足用户存储更多元素的需求。 值得一提的是,vector 容器扩容的整个过程,和 realloc(
前面提到,我们可以将 vector 容器看做是一个动态数组。换句话说,在不超出 vector 最大容量限制(max_size() 成员方法的返回值)的前提下,该类型容器可以自行扩充容量来满足用户存储更多元素的需求。 值得一提的是,vector 容器扩容的整个过程,和 realloc() 函数的实现方法类似,大致分为以下 4 个步骤:
通过以上分析不难看出,vector 容器的扩容过程是非常耗时的,并且当容器进行扩容后,之前和该容器相关的所有指针、迭代器以及引用都会失效。因此在使用 vector 容器过程中,我们应尽量避免执行不必要的扩容操作。 要实现这个目标,可以借助 vector 模板类中提供的 reserve() 成员方法。不过在讲解如何用 reserve() 方法避免 vector 容器进行不必要的扩容操作之前,vector 模板类中还提供有几个和 reserve() 功能类似的成员方法,很容易混淆,这里有必要为读者梳理一下,如表 1 所示。
通过对以上几个成员方法功能的分析,我们可以总结出一点,即只要有新元素要添加到 vector 容器中而恰好此时 vector 容器的容量不足时,该容器就会自动扩容。 因此,避免 vector 容器执行不必要的扩容操作的关键在于,在使用 vector 容器初期,就要将其容量设为足够大的值。换句话说,在 vector 容器刚刚构造出来的那一刻,就应该借助 reserve() 成员方法为其扩充足够大的容量。 举个例子,假设我们想创建一个包含 1~1000 的 vector<int>,通常会这样实现: vector<int>myvector; for (int i = 1; i <= 1000; i++) { myvector.push_back(i); }值得一提的是,上面代码的整个循环过程中,vector 容器会进行 2~10 次自动扩容(多数的 STL 标准库版本中,vector 容器通常会扩容至当前容量的 2 倍,而这里 1000≈2 10),程序的执行效率可想而知。 在上面程序的基础上,下面代码演示了如何使用 reserve() 成员方法尽量避免 vector 容器执行不必要的扩容操作: vector<int>myvector; myvector.reserve(1000); cout << myvector.capacity(); for (int i = 1; i <= 1000; i++) { myvector.push_back(i); }相比前面的代码实现,整段程序在运行过程中,vector 容器的容量仅扩充了 1 次,执行效率大大提高。 当然在实际场景中,我们可能并不知道 vector 容器到底要存储多少个元素。这种情况下,可以先预留出足够大的空间,当所有元素都存储到 vector 容器中之后,再去除多余的容量。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ArcGIS Viewer for Flex(入门)
- xml解析及编译汇总 valgrind检测内存泄露 http://blog.csdn
- React-Native遇到问题集锦
- c# – StyleCop警告SA1126:对类名称的PrefixCallsCorrectl
- ruby-on-rails – 将设计sign_in形式设计成Twitter Bootstr
- cocos2d坐标系
- 数据持久化-CoreData、SQLite、FMDB
- 使用SQLCipher 对sqlite数据库进行解密
- ruby-on-rails – 为什么这个gem没有将rake任务添加到Rails
- FireDAC 下的 Sqlite [12] - 备忘录(草草结束这个话题了)