C++中vector的用法
- 格式:doc
- 大小:50.00 KB
- 文档页数:7
C语⾔之qsort函数详解⽬录⼀.qsort函数原型⼆.qsort常见的⼏种⽐较函数1.int类型的排序2.double类型的排序3.char类型的排序4.字符串的排序:1.按⾸字母排序2.按字符串长度排序:总结⼀.qsort函数原型qsort 功能: 使⽤快速排序例程进⾏排序,这个函数是根据⼆分法写的,其时间复杂度为n*log(n)#include<stdlib.h>void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *))各参数:1. 待排序数组⾸地址(可直接输⼊待排序数组名,或是指向数组的指针)2. 数组中待排序元素数量(可以⽤sizeof()来求)3. 各元素的占⽤空间⼤⼩(可以⽤sizeof(arr[0])来求)4. 指向函数的指针这个qsort需要我们⾃⼰创建⼀个⽐较函数,基本都是这个函数int cmp(const void* _a, const void* _b);⼆.qsort常见的⼏种⽐较函数1.int类型的排序int cmp(const void* _a, const void* _b){int* a = (int*)_a;int* b = (int*)_b;return *a-*b;}int main(){int num[10] = { 5,7,8,1,26,52,9,3,14,56 };int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%d ", num[i]);}}*a-*b这个是从⼩到⼤排序,如果想从⼤到⼩排序就是*b-*a;升序排序结果图:降序排列:int cmp(const void* _a, const void* _b){int* a = (int*)_a;int* b = (int*)_b;return *b-*a;}int main(){int num[10] = { 5,7,8,1,26,52,9,3,14,56 };int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%d ", num[i]);}}其实降序排序就是换成*b-*a降序排序效果图:2.double类型的排序int cmp(const void* _a, const void* _b){double* a = (double*)_a;double* b = (double*)_b;return *(double*)_a > *(double*)_b ? 1 : -1;;}int main(){double num[4] = { 2.1,5.2,3.2,445.2};int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%.2f ", num[i]);}}double类型的⽐较特殊,因为返回值是int,所以如果是两个特别相近的浮点数相减,那么就有可能会出现的结果⽐-1⼤并且⽐1⼩,这样系统就会默认为0,所以这⾥使⽤了⼀个三⽬运算,⽤来⽐较。
vector的find函数用法(一)vector的find函数用法详解1. 基本用法vector是C++标准库中的一个容器,提供了一系列用于操作动态数组的函数,其中之一就是find函数。
find函数的基本用法如下:iterator find (iterator first, iterator last, const T& val);其中,first是指向容器中要搜索的起始位置的迭代器,last是指向要搜索的结束位置的迭代器(不包含在搜索范围内),val则是要搜索的值。
find函数会在指定范围内搜索指定的值,并返回一个指向第一个匹配元素的迭代器。
如果未找到匹配的元素,则返回指向结束位置的迭代器。
2. 示例演示假设我们有一个存储整数的vector容器如下:std::vector<int> numbers = {1, 5, 10, 15, 20};以下是vector的find函数的一些示例用法:•找到元素1的位置:auto it = std::find((), (), 1);这里使用find函数在numbers容器中查找值为1的元素。
如果找到了匹配的元素,it将指向该元素的位置;如果找不到,it将指向(),即结束位置的迭代器。
•判断元素是否存在:bool found = (std::find((), (), 10) != ());这里将find函数的返回值与()比较,如果两者相等,则说明没找到匹配的元素;否则,找到了匹配的元素。
•使用find函数进行范围搜索:std::vector<int> searchRange = {10, 15};auto it = std::find((), (), ());auto itEnd = std::find((), (), ());auto result = std::find(it, itEnd, ());这里我们定义了一个searchRange存储要搜索的元素范围(10和15)。
C++pair⽅法与vector⽅法案例详解⼀,pair⽅法类模板:template <class T1, class T2> struct pair参数:T1是第⼀个值的数据类型,T2是第⼆个值的数据类型。
功能:pair将⼀对值组合成⼀个值,这⼀对值可以具有不同的数据类型(T1和T2),两个值可以分别⽤pair的两个公有函数first和second访问。
具体⽤法:访问两个元素(通过first和second):pair<int, double> p1; //使⽤默认构造函数p1.first = 1;p1.second = 2.5;cout << p1.first << ' ' << p1.second << endl;输出结果:1 2.5赋值operator =:1)利⽤make_pair:pair<int, double> p1;p1 = make_pair(1, 1.2);2)变量间赋值:pair<int, double> p1(1, 1.2);pair<int, double> p2 = p1;⼆,vector⽅法vector⽅向需要头函数#include<vector>向量(Vector)是⼀个封装了动态⼤⼩数组的顺序容器(Sequence Container)。
跟任意其它类型容器⼀样,它能够存放各种类型的对象。
可以简单的认为,向量是⼀个能够存放任意类型的动态数组。
1.构造函数vector():创建⼀个空vectorvector(int nSize):创建⼀个vector,元素个数为nSizevector(int nSize,const t& t):创建⼀个vector,元素个数为nSize,且值均为tvector(const vector&):复制构造函数vector(begin,end):复制[begin,end)区间内另⼀个数组的元素到vector中2.增加函数void push_back(const T& x):向量尾部增加⼀个元素Xiterator insert(iterator it,const T& x):向量中迭代器指向元素前增加⼀个元素xiterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素xiterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插⼊另⼀个相同类型向量的[first,last)间的数据3.删除函数iterator erase(iterator it):删除向量中迭代器指向元素iterator erase(iterator first,iterator last):删除向量中[first,last)中元素void pop_back():删除向量中最后⼀个元素void clear():清空向量中所有元素4.遍历函数reference at(int pos):返回pos位置元素的引⽤reference front():返回⾸元素的引⽤reference back():返回尾元素的引⽤iterator begin():返回向量头指针,指向第⼀个元素iterator end():返回向量尾指针,指向向量最后⼀个元素的下⼀个位置reverse_iterator rbegin():反向迭代器,指向最后⼀个元素reverse_iterator rend():反向迭代器,指向第⼀个元素之前的位置5.判断函数bool empty() const:判断向量是否为空,若为空,则向量中⽆元素6.⼤⼩函数int size() const:返回向量中元素的个数int capacity() const:返回当前向量张红所能容纳的最⼤元素值int max_size() const:返回最⼤可允许的vector元素数量值7.其他函数void swap(vector&):交换两个同类型向量的数据void assign(int n,const T& x):设置向量中第n个元素的值为xvoid assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素到此这篇关于C++ pair⽅法与vector⽅法案例详解的⽂章就介绍到这了,更多相关C++ pair⽅法与vector⽅法内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
vector end函数vector的end函数是C++标准库中的一个函数,用于返回指向vector容器最后一个元素之后位置的迭代器。
在本文中,我们将探讨vector容器及其end函数的用法和功能,并且通过实际例子来展示其在实际编程中的应用。
让我们来了解一下vector容器。
vector是C++标准库中的一个动态数组容器,可以存储任意类型的数据,并且可以根据需要动态调整容器的大小。
这使得vector成为了一个非常有用的容器,特别是在需要频繁插入和删除元素的情况下。
在使用vector容器时,我们可以通过调用其end函数来获取指向容器最后一个元素之后位置的迭代器。
end函数返回的迭代器可以用于遍历容器的元素,或者用于指示容器的结束位置。
需要注意的是,end函数返回的迭代器并不指向容器的最后一个元素,而是指向最后一个元素之后的位置。
下面我们通过一个简单的例子来进一步理解vector的end函数的用法。
假设我们有一个存储整数的vector容器,其中包含了一些随机的整数。
我们想要遍历这个容器,并找到其中的最大值。
我们可以使用end函数来确定遍历的结束位置,代码如下:```#include <iostream>#include <vector>int main() {std::vector<int> numbers = {1, 5, 3, 9, 2, 7, 4};int max = numbers[0];for (auto it = numbers.begin(); it != numbers.end(); ++it) {if (*it > max) {max = *it;}}std::cout << "The maximum number is: " << max << std::endl;return 0;}```在这个例子中,我们首先创建了一个包含一些随机整数的vector容器。
std vector用法(原创版)目录1.概述2.标准容器库3.vector 的特点4.vector 的基本用法5.vector 的常用操作6.示例正文1.概述在 C++编程中,容器是一种存储数据的结构,它可以方便地对数据进行操作。
C++标准库提供了一些容器,如 vector、list、map 等,这些容器统称为标准容器库。
在这篇文章中,我们将介绍 vector 的使用方法。
2.标准容器库vector(向量)是 C++标准容器库中的一个重要成员,它是一个动态数组,可以根据需要自动调整大小。
vector 可以存储任何类型的数据,包括整数、浮点数、对象等。
3.vector 的特点vector 具有以下特点:- 动态数组:可以根据需要自动调整大小。
- 随机访问:可以通过下标直接访问元素,时间复杂度为 O(1)。
- 插入和删除元素:在尾部插入和删除元素的时间复杂度为 O(1),但在其他位置的插入和删除操作的时间复杂度为 O(n)。
- 容量:vector 有一个容量属性,表示当前数组的最大容量。
当数组的元素数量超过容量时,数组会自动扩容。
4.vector 的基本用法要使用 vector,首先需要包含相应的头文件<vector>。
以下是一些基本的 vector 用法:- 创建 vector:使用模板创建一个 vector 对象,如下所示:```cppstd::vector<int> vec;```- 访问元素:通过下标访问 vector 中的元素,如下所示:```cppint num = vec[0];```- 插入元素:在 vector 末尾插入元素,如下所示:```cppvec.push_back(10);```- 删除元素:从 vector 中删除元素,如下所示:```cppvec.pop_back();```- 获取大小:使用 size() 函数获取 vector 的大小,如下所示:```cppint size = vec.size();```- 判断是否为空:使用 empty() 函数判断 vector 是否为空,如下所示:```cppbool is_empty = vec.empty();```5.vector 的常用操作vector 提供了很多实用的操作,如下所示:- 插入元素:在指定位置插入元素,使用 insert() 函数,如下所示:```cppvec.insert(vec.begin(), 10);```- 删除元素:从指定位置删除元素,使用 erase() 函数,如下所示:```cppvec.erase(vec.begin());```- 替换元素:替换指定位置的元素,使用 replace() 函数,如下所示:```cppvec.replace(vec.begin(), 10, 20);```- 遍历:使用迭代器遍历 vector,如下所示:```cppfor (int i : vec) {std::cout << i << " ";}```6.示例以下是一个简单的 vector 使用示例:```cpp#include <iostream>#include <vector>int main() {std::vector<int> vec;vec.push_back(10);vec.push_back(20);vec.push_back(30);for (int i : vec) {std::cout << i << " ";}std::cout << std::endl;vec.erase(vec.begin());vec.erase(vec.begin());for (int i : vec) {std::cout << i << " ";}std::cout << std::endl;return 0;}```输出结果:```10 20 3020 30```通过以上内容,我们可以看到 vector 在 C++编程中的应用非常广泛,它为我们处理数据提供了极大的便利。
vector.reserve的用法
vector.reserve是C++中vector容器的一个函数,它的作用是用来预留内存空间,以便提前准备好存放元素的空间,以提高插入元素的效率。
vector.reserve的使用方法很简单,只需要在定义vector容器时,调用reserve函数,传入一个参数,即预留的内存空间大小,就可以完成预留内存空间的操作。
比如:
vector<int> vec;
vec.reserve(100);
这样,就可以预留100个元素的内存空间,以便提高插入元素的效率。
vector.reserve的另一个作用是,可以用来改变vector容器的大小,比如:
vector<int> vec;
vec.reserve(100);
这样,就可以将vec的大小改变为100,而不是默认的10。
vector.reserve的使用有一定的局限性,它只能用来预留内存空间,而不能用来删除元素,也不能用来改变vector容器的大小。
总之,vector.reserve是一个非常有用的函数,它可以用来预留内存空间,以提高插入元素的效率,也可以用来改变vector 容器的大小。
使用vector.reserve可以让vector容器更加高效,更加灵活。
c++ vector pair用法C++中的`vector<pair>`用于存储一对值,其中每对值都由两个元素组成。
`pair`是C++标准库中的一个模板类,用于表示一个有序的、不同类型的数据对。
下面是`vector<pair>`的基本用法示例:```cpp#include <iostream>#include <vector>#include <utility> // 包含对 pair 进行操作的头文件int main() {std::vector<std::pair<int, std::string>> vec; // 声明一个存储整数和字符串对的向量vec.push_back(std::make_pair(1, "one")); // 向 vector 中添加一对值vec.push_back(std::make_pair(2, "two"));vec.push_back(std::make_pair(3, "three"));// 遍历 vector<pair>for (const auto& pair : vec) {std::cout << "First: " << pair.first << ", Second: " <<pair.second << std::endl;}return 0;}```在上面的示例中,我们首先需要包含头文件`<utility>`,其中包含了对`pair`进行操作的函数和模板。
然后,我们声明了一个`vector<pair<int, std::string>>`,用于存储整数和字符串对。
vector的reserve和resize用法
std::vector是C++ 标准库中的一个动态数组,它可以根据需要自动调整大小。
reserve和resize是std::vector的两个常用成员函数,它们分别用于预留空间和改
变大小。
1.reserve:
reserve函数用于预留一定数量的元素空间,但不会改变vector的大小。
这意味着它不会在内存中分配空间,也不会触发元素的构造或析构。
调用reserve之后,如
果你知道将会添加很多元素,可以预先预留一些空间,这样可以减少将来重新分配内存和复制元素的次数,从而提高性能。
cpp
std::vector<int> vec;
vec.reserve(100); // 预留100个元素的空间
2.resize:
resize函数用于改变vector的大小。
你可以指定新的大小,如果新的大小大于当前的大小,那么vector会尝试在内存中分配足够的空间来容纳新元素,并调用相应的构造函数来构造这些新元素。
如果新的大小小于当前的大小,那么vector会销毁超
出的元素并释放相应的内存。
cpp
std::vector<int> vec;
vec.resize(100, 0); // 将向量的大小改为100,并用0填充新元素使用reserve和resize时需要注意的一点是,它们不会改变vector中元素的数量或顺序,只是预留空间或改变大小。
如果你需要添加或删除元素,应该使
用push_back, pop_back, insert, erase等函数。
vector end函数Vector是C++ STL中的一个重要容器,它可以动态地调整大小,存储任意类型的数据,并且支持快速的随机访问。
在使用Vector时,我们经常需要使用end函数来获取Vector中最后一个元素的迭代器。
本文将详细介绍Vector end函数的用法和注意事项。
一、Vector end函数的用法Vector end函数用于获取Vector中最后一个元素的迭代器,其语法如下:vector_name.end()其中,vector_name是Vector的名称。
end函数返回的是一个迭代器,指向Vector中最后一个元素的下一个位置。
需要注意的是,如果Vector为空,则end函数返回的迭代器和begin函数返回的迭代器相同。
下面是一个简单的示例代码,演示了如何使用Vector end函数:```#include <iostream>#include <vector>using namespace std;int main(){vector<int> vec = {1, 2, 3, 4, 5};// 使用end函数获取最后一个元素的迭代器auto it = vec.end() - 1;// 输出最后一个元素cout << *it << endl;return 0;}```上述代码中,我们首先定义了一个包含5个整数的Vector,然后使用end函数获取最后一个元素的迭代器,并输出了最后一个元素的值。
需要注意的是,我们使用了auto关键字来自动推导迭代器的类型,这是C++11中的新特性。
二、Vector end函数的注意事项在使用Vector end函数时,需要注意以下几点:1. end函数返回的是一个迭代器,而不是一个指针。
因此,我们不能对end函数返回的迭代器进行指针运算,否则会导致未定义的行为。
2. end函数返回的迭代器指向的是最后一个元素的下一个位置,而不是最后一个元素本身。
vector的初始化⽅式及⽤法笔记(不断更新)vector的初始化⽅式1)第⼀种,类似于数组的⽅式:vector<string> letter(3);letter[0] = "find";letter[1] = "the';letter[2] = "world";也可以⽤字符数组(较⿇烦,不易理解,易混淆,所以推荐⽤string)vector<char> letter[3];2)push_back的⽅式:vector<string> letter;letter.push_back("find");letter.push_back("the");letter.push_back("world");3)构造函数的⽅式:string str[]={"find","the","world"};C++的string末尾以\0结尾,但是长度即为length()函数(如果下标从0开始,算上\0)。
vector<string> strArray(str, str+3);4) ⼆维数组vector<vector<int>> array;注意易错点:vector<int> sum;sum[0]=1; X这种不能⽤下标赋值,只能⽤push_back()Vector 常⽤函数:push_back()pop_back()insert(it,x)erase(it)erase(first,last) 删除[first,last)的元素,左闭右开v.begin() 对应v[0]v.end() 对应末尾下⼀个地址与迭代器配合。
C++Vector用法C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。
要解决此问题我们自己实现这样的类。
在标准C++中,用容器向量(vector)实现。
容器向量也是一个类模板。
标准库vector类型使用需要的头文件:#include <vector>。
vector 是一个类模板。
不是一种数据类型,vector<int>是一种数据类型。
Vector的存储空间是连续的,list不是连续存储的。
一、定义和初始化vector< typeName > v1; //默认v1为空,故下面的赋值是错误的v1[0]=5;vector<typeName>v2(v1); 或v2=v1;或vector<typeName> v2(v1.begin(), v1.end());//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被扩充为v1.size()。
vector< typeName > v3(n,i);//v3包含n个值为i的typeName类型元素vector< typeName > v4(n); //v4含有n个值为0的元素int a[4]={0,1,2,3,3}; vector<int> v5(a,a+5);//v5的size为5,v5被初始化为a的5个值。
后一个指针要指向将被拷贝的末元素的下一位置。
vector<int> v6(v5);//v6是v5的拷贝vector< 类型> 标识符(最大容量,初始所有值);二、值初始化1> 如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化。
2> 如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。
3> 如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。
三、vector对象最重要的几种操作1. v.push_back(t) 在容器的最后添加一个值为t的数据,容器的size变大。
另外list有push_front()函数,在前端插入,后面的元素下标依次增大。
2. v.size() 返回容器中数据的个数,size返回相应vector类定义的size_type的值。
v.resize(2*v.size)或v.resize(2*v.size, 99) 将v的容量翻倍(并把新元素的值初始化为99)3. v.empty() 判断vector是否为空4. v[n] 返回v中位置为n的元素5. v.insert(pointer,number, content) 向v中pointer指向的位置插入number个content 的内容。
还有v. insert(pointer, content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。
6. v.pop_back() 删除容器的末元素,并不返回该元素。
7.v.erase(pointer1,pointer2) 删除pointer1到pointer2中间(包括pointer1所指)的元素。
vector中删除一个元素后,此位置以后的元素都需要往前移动一个位置,虽然当前迭代器位置没有自动加1,但是由于后续元素的顺次前移,也就相当于迭代器的自动指向下一个位置一样。
8. v1==v2 判断v1与v2是否相等。
9. !=、<、<=、>、>= 保持这些操作符惯有含义。
10. vector<typeName>::iterator p=v1.begin( ); p初始值指向v1的第一个元素。
*p取所指向元素的值。
对于const vector<typeName>只能用vector<typeName>::const_iterator类型的指针访问。
11. p=v1.end( ); p指向v1的最后一个元素的下一位置。
12.v.clear() 删除容器中的所有元素。
12.v.clear() 删除容器中的所有元素。
#include<algorithm>中的泛函算法搜索算法:find() 、search() 、count() 、find_if() 、search_if() 、count_if()分类排序:sort() 、merge()删除算法:unique() 、remove()生成和变异:generate() 、fill() 、transformation() 、copy()关系算法:equal() 、min() 、max()sort(v1.begin(),vi.begin()+v1.size/2); 对v1的前半段元素排序list<char>::iterator pMiddle =find(cList.begin(),cList.end(),'A');找到则返回被查内容第一次出现处指针,否则返回end()。
vector< typeName >::size_type x ; vector< typeName >类型的计数,可用于循环如同for(int i)初学C++的程序员可能会认为vector的下标操作可以添加元素,其实不然:vector<int> ivec; // empty vectorfor (vector<int>::size_type ix = 0; ix != 10; ++ix)ivec[ix] = ix; // disaster: ivec has no elements上述程序试图在ivec中插入10个新元素,元素值依次为0到9的整数。
但是,这里ivec是空的vector对象,而且下标只能用于获取已存在的元素。
这个循环的正确写法应该是:for (vector<int>::size_type ix = 0; ix != 10; ++ix)ivec.push_back(ix); // ok: adds new element with value ix警告:必须是已存在的元素才能用下标操作符进行索引。
通过下标操作进行赋值时,不会添加任何元素。
仅能对确知已存在的元素进行下标操作四、内存管理与效率1.使用reserve()函数提前设定容量大小,避免多次容量扩充操作导致效率低下。
关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。
(要知道这个最大值,只要调用名叫max_size 的成员函数。
)对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。
vector容器支持随机访问,因此为了提高效率,它内部使用动态数组的方式实现的。
在通过reserve() 来申请特定大小的时候总是按指数边界来增大其内部缓冲区。
当进行insert 或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配当前大小的1.5~2倍的新内存区,再把原数组的内容复制过去。
所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。
正如上面的代码告诉你的那样。
而进行pop_back操作时,capacity并不会因为vector容器里的元素减少而有所下降,还会维持操作之前的大小。
对于vector容器来说,如果有大量的数据需要进行push_back,应当使用reserve()函数提前设定其容量大小,否则会出现许多次容量扩充操作,导致效率低下。
reserve成员函数允许你最小化必须进行的重新分配的次数,因而可以避免真分配的开销和迭代器/指针/引用失效。
但在我解释reserve为什么可以那么做之前,让我简要介绍有时候令人困惑的四个相关成员函数。
在标准容器中,只有vector和string提供了所有这些函数。
(1) size()告诉你容器中有多少元素。
它没有告诉你容器为它容纳的元素分配了多少内存。
(2) capacity()告诉你容器在它已经分配的内存中可以容纳多少元素。
那是容器在那块内存中总共可以容纳多少元素,而不是还可以容纳多少元素。
如果你想知道一个vector或string中有多少没有被占用的内存,你必须从capacity()中减去size()。
如果size和capacity返回同样的值,容器中就没有剩余空间了,而下一次插入(通过insert或push_back等)会引发上面的重新分配步骤。
(3) resize(Container::size_type n)强制把容器改为容纳n个元素。
调用resize之后,size将会返回n。
如果n小于当前大小,容器尾部的元素会被销毁。
如果n大于当前大小,新默认构造的元素会添加到容器尾部。
如果n大于当前容量,在元素加入之前会发生重新分配。
(4) reserve(Container::size_type n)强制容器把它的容量改为至少n,提供的n不小于当前大小。
这一般强迫进行一次重新分配,因为容量需要增加。
(如果n小于当前容量,vector 忽略它,这个调用什么都不做,string可能把它的容量减少为size()和n中大的数,但string 的大小没有改变。
在我的经验中,使用reserve来从一个string中修整多余容量一般不如使用“交换技巧”,那是条款17的主题。
)这个简介表示了只要有元素需要插入而且容器的容量不足时就会发生重新分配(包括它们维护的原始内存分配和回收,对象的拷贝和析构和迭代器、指针和引用的失效)。
所以,避免重新分配的关键是使用reserve尽快把容器的容量设置为足够大,最好在容器被构造之后立刻进行。
例如,假定你想建立一个容纳1-1000值的vector<int>。
没有使用reserve,你可以像这样来做:vector<int> v;for (int i = 1; i <= 1000; ++i) v.push_back(i);在大多数STL实现中,这段代码在循环过程中将会导致2到10次重新分配。
(10这个数没什么奇怪的。
记住vector在重新分配发生时一般把容量翻倍,而1000约等于210。
)把代码改为使用reserve,我们得到这个:vector<int> v;v.reserve(1000);for (int i = 1; i <= 1000; ++i) v.push_back(i);这在循环中不会发生重新分配。
在大小和容量之间的关系让我们可以预言什么时候插入将引起vector或string执行重新分配,而且,可以预言什么时候插入会使指向容器中的迭代器、指针和引用失效。