摘要: 技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性。
我对向量容器vector的理解就是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍.
他的结构如下
一 定义
vector< 类型 > 标识符(最大容量,初始所有值)
vector是一种类模板,那么他有很多行为与类相似
头文件 #include <vector>
//a.定义 vector<typeName> v; vector<int> v; //b.拷贝构造 vector<typeName> v1(v); 例:vector<int> v1(v); vector<int> v1; //c.赋值拷贝 v1 = v; //如果v的size比v1的size大,则自动扩充v1的空间,反之亦然 //d.按指定元素个数定义 vector<int> v2(5); //v2含有5个值为0的元素 //e.指定元素个数及类型 vector<int> v3(5,10);//v3包含5个值为10的int类型元素 //f.与array间的转换 int a[3]={0,1,2}; vector<int> v4(a,a+3);
二 基本使用
vector<int> v; //在vector尾端插入元素 //但是没有在前面插入元素,上面的vector结构图中,我们可以看出来vector是一种向后扩充的容器, //如果在前面插入,那后面所有的元素将后移,造成巨大的消耗,所以没有push_front() //同理没有pop_front() v.push_back(1); //删除最后一个元素 v.pop_back(); //返回元素个数 int count = v.size(); //重新设定vector的size v.resize(2*(v.size())); //判断容器是否为空 bool isEmpty = v.empty(); //[index]操作,返回下表为index的元素 int tmp = v[1]; //定义迭代器 vector<int> ::iterator iter = v.begin(); for(int i = 0; i<3; i++ ) { v.push_back(1); // 1 1 1 } //在 v的前面插入两个 5 v.insert(iter, 2, 5); // 5 5 1 1 1 //在头部插入3 v.insert(v.begin(), 3);//3 5 5 1 1 1 //在尾部插入3 v.insert(v.end(), 3);//3 5 5 1 1 1 3 //下表5的前面插入3 v.insert(v.begin()+5, 3);//3 5 5 1 1 3 1 3 //删除指定下标元素 v.erase(v.begin()+1); //3 5 1 1 3 1 3 //清空 v.clear(); //起始地址 v.data(); //最后一个元素后面的地址 v.end(); //实际内存大小 v.capacity(); //at(下标) v.at(1); //返回最后一个元素 v.back(); //返回第一个元素 v.front(); //将指定区间内的元素赋值给v v.assign(v.begin()+1, v.begin()+2); //赋值 将三个 1 赋值给v 那么vecotr将变为 1 1 1 v.assign(3, 1); //最大内存 v.max_size(); //输出 for(auto iii : v) { cout << iii <<endl; }
三 vector支持的算法
增加头文件#include<algorithm> //算法
#include <algorithm> int main() { //可以使用的全局算法有 //搜索算法:find() 、search() 、count() 、find_if() 、search_if() 、count_if() //分类排序:sort() 、merge() //删除算法:unique() 、remove() //生成和变异:generate() 、fill() 、transformation() 、copy() //关系算法:equal() 、min() 、max() vector<int> c; for(int i = 0; i<10; i++ ) { c.push_back(i); // } //查找函数 find(begin,end, searchItem) auto pItem = ::find(c.begin(), c.end(), 3); if(pItem != c.end()) cout << "找到了: " << *pItem << endl; else cout << "没找到" << endl; vector<int> c1; for(int i = 0; i<10; i++ ) { c1.push_back(i+10); // } //查找函数search 是否包含子序列容器向量 如果包含 返回包含位置 auto pItem1 = ::search(c.begin(), c.end(), c1.begin()+2, c1.begin()+5); if(pItem1 != c.end()) cout << "找到了: " << *pItem1 << endl; else cout << "没找到" << endl; //算法就不一一举例了 return 0; }
输出结果
四 内存管理
上面提到过vector的扩充是以2倍的形式扩充,它的扩充过程可以理解成 if (v.size()元素个数 > v.capacity()实际内存) v.resize(2*v.capacity())
当vector发现元素个数大于实际内存时, vector将重新申请一块内存为原来的内存2倍的空间 然后将原来的元素一一copy过去,我们都知识申请内存是非常耗时的,所以我们一定要把握好vector的内存尺度
下面来测试一下
void vector_test_capactity() { //创建vector std::vector<int> v; for(int i = 0; i<10 ; i++) { cout<<"容器内元素个数: " << v.size() << " "<<"vector内存大小: " << v.capacity()<<endl; v.push_back(i); } }
输出结果
时间: 2024-10-15 01:07:20