定制网站建设加盟代理,住建部网站建设部,百度电脑网页版,沈阳哪家网站好一、基本概念
vector教据结构和数组非常相似,也称为单端数组#xff0c;但是数组是静态空间#xff0c;而vector可以动态扩展。 动态的扩展流程如下#xff1a; 动态扩展并不是在原空间之后续接新空间#xff0c;而是找更大的广存空间#xff0c;然后将原数据拷贝新空间但是数组是静态空间而vector可以动态扩展。 动态的扩展流程如下 动态扩展并不是在原空间之后续接新空间而是找更大的广存空间然后将原数据拷贝新空间释放原空间。 vector容器的迭代器是支持随机访问的迭代器也就是说可以随机访问容器内的任何一个位置的数据。
二、vector的构造函数
vector v; 采用模板实现类实现默认构造函效。 vector(v.begin(), v.end( )) 将v[begin(), end())区间中的元素拷贝给本身。 vector(n,elem) ; 构造函数将n个elem拷贝给本身。 vector( const vector vec); 拷贝构造函数。 具体的实现方法如下所示 //默认构造方式vectorint v;for (int i 0; i 4; i){v.push_back(i);}VectorPrint(v);// 通过区间的方式进行构造vectorintv1(v.begin(), v.end());VectorPrint(v1);//通过n个elem的方式构造vectorintv2(2, 100);VectorPrint(v2);//通过拷贝构造的方式进行传递vectorintv3(v2);VectorPrint(v3);三、vector赋值操作
当我们构建好vector之后我们可以对vector进行赋值操作具体的样例如下
vector operator( const vector vec); 重载等号操作符。 assign(beg, end) ;将[beg, end)区间中的数据拷贝赋值给本身。 assign(nelen); 将n个elem拷贝赋值给本身。 具体的实现细节如下 //赋值操作:重载等号vectorintv1;v1 v;VectorPrint(v1);//赋值操作:assign操作1vectorintv2;v2.assign(v1.begin(), v1.end());VectorPrint(v2);//赋值操作:assign操作2vectorintv3;v3.assign(2, 100);VectorPrint(v3);四、vector容量和大小
具体的函数接口如下 empty( ); 判断容器是否为空 capacity(); 容器的容量 size(); 返回容器中元素的个数 resize( int num); 重新指定容器的长度为num若容器变长则以默认值0填充新位置。如果容器变短则末尾超出容器长度的元素被删除。 resize( int nun elem); 重新指定容器的长度为num若容器变长则以elem值填充新位置。如果容器变短则末尾超出容器长度的元素被删除 具体的实现样例如下 vectorint v;for (int i 0; i 10; i){v.push_back(i);}if (v.empty()){cout 容器为空 endl;}else{cout 容器不为空 endl;cout 容器容量为 v.capacity() endl; cout 容器的大小为 v.size() endl;} //重新指定容器大小多出的位置用默认值0填充v.resize(10);//重新指定容器大小多出的位置用设置值10填充v.resize(15, 10);//重新指定容器大小,超出的部分会被删掉v.resize(2);五、vector插入和删除
具体的实现接口如下 push_back(ele);尾部插入元素ele pop_back(删除最后一个元素 insert (const_iterator posele);迭代器指向位pos插入元素ele insert( const_iterator posint count,ele);迭代器指向位置pos插入count个元素ele erase(const_iterator pos);删除迭代器指向的元素 erase(const_iterator startconst_iterator end);删除迭代器从start到end之间的元素 clear();删除容器中所有元素 具体样例如下: vectorint v;//尾插法插入数据v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);vectorPrint(v);//尾部删除法,一次删一个v.pop_back();vectorPrint(v);//插入,第一个参数是迭代器v.insert(v.begin(), 100);vectorPrint(v);//插入,第一个参数是迭代器,插入两个10v.insert(v.begin(), 2, 10);vectorPrint(v);//删除v.erase(v.begin()3);vectorPrint(v);//删除一个区间v.erase(v.begin() 3, v.end()-2);vectorPrint(v);//清空v.clear();vectorPrint(v);输出结果为
1 2 3 4 5
1 2 3 4
100 1 2 3 4
10 10 100 1 2 3 4
10 10 100 2 3 4
10 10 100 3 4
六、vector的数据存取
具体的实现接口如下 at( int idx); 返回索引idx所指的数据 operator[]: 返回索引idx所指的数据 front( ); 返回容器中第一个数据元素 back();返回容器中最后一个数据元素 具体实现样例如下 for (int i 0; i v.size(); i){//使用at接口进行输出cout v.at(i) ;//使用索引值进行输出cout v[i] ;//获取第一个元素cout v.front() endl;//获取最后一个元素cout v.back() endl;}七、vector互换容器
实现两个容器内元素进行互换。 函数接口如下 swap(vec); 将vec与本身的元素互换 具体的实现样例如下 void PrintVector(vectorint v)
{for (vectorint::iterator it v.begin(); it v.end(); it){cout *it ;} cout endl;
}vectorint v;vectorint v1;for (int i 0; i 3; i){v.push_back(i);v1.push_back(i10);}PrintVector(v);PrintVector(v1);v.swap(v1);PrintVector(v);PrintVector(v1);以上接口的实用技巧 vectorint v;for (int i 0; i 3000; i){v.push_back(i);} cout v.capacity() 容量endl;cout v.size() 大小endl;//当我们重置容器的大小之后1v.resize(2);cout v.capacity() 容量endl;cout v.size() 大小endl;有以上的代码代码的输入为
3597容量
3000大小
3597容量
2大小我们可以看出当最先的容器申请了3597大小的容量但是当我们重置容器大小之后虽然容器的大小变小了但是容量并没有变化。这就造成了资源的浪费。我们可以通过以下的操作来收缩容器的容量
vectorint(v).swap(v);对以上操作进行解释vector(v)操作是创建了一个新的对象该对象为匿名对象这个匿名对象是按照v的大小来初始化初始化之后调用swap操作之后将指向v的指针指向了该匿名对象匿名对象指针指向了v当匿名对象实用完成之后编译器会将匿名对象指针指向的内存进行回收。通过这样的一个操作达到了收缩容量的作用。
八、vector的预留空间
该操作可以减少vector在动态扩展容量时的扩展次数具体的接口说明如下 reserve(int len); 容器预留len个元素长度。预留位置不初始化元素不可访问。 具体的实现样例如下 vectorint v;//提前开辟够量的空间v.reserve(199999);int num 0;int *p NULL;for (int i 0; i 199999; i){v.push_back(i);if (p ! v[0]){p v[0];num;}}cout num endl;
}当随着容器内需要存放的数据不断的增大容器需要不断的申请内存空间这样的操作需要很大的工程所以为了避免这样重复的操作所以我们需要实现申请一块已经足够的空间。