成都私人视频网站制作平台,十大网络营销成功案例,二维码引流推广的平台,网站开发vs平台的功能一、vector是什么
vector是STL第一个正式的容器#xff0c;它的底层其实就是动态数组#xff0c;插入数据时当容量满了会自动扩容#xff0c;它和string差不多#xff0c;不同的之处之一在于vector本身是一个模板#xff0c;它这个容器中可以存放各种各样的类型的数据它的底层其实就是动态数组插入数据时当容量满了会自动扩容它和string差不多不同的之处之一在于vector本身是一个模板它这个容器中可以存放各种各样的类型的数据而string已经是模板实例化之后的结果。 vector类模板的第一个参数是T其实就是你要放进容器中数据的类型第二个参数我们暂且不管它是一个空间配置器主要是提高效率的我们在实例化时暂且不传第二个参数用它的默认缺省值我们暂且只传第一个参数即可。
在本篇中涉及到allocator空间配置器的我们暂且不用管可以先忽略。 vector大多数接口和string的功能用法上没有什么太大的区别这篇文章不会细讲所以建议大家先去看一下这篇文章 - string类的基本实现
二、基本使用
1、构造函数 C98版本下有4个构造函数我们这里只说C98不谈论其它版本。
我们来看一下它的使用
void test_vector1()
{vectorint v1; //(1)默认构造vectorint v2(10,1); //(2)带参构造int类型的10个1vectorint v3(v2.begin(),v2.end()); //(3)迭代器区间构造vectorint v4(v3); //(4)拷贝构造
}
带有空间配置器的构造函数我们用它的缺省值。
value_type就是模板的第一个参数T即容器中存放数据的类型。
通过调试我们可以看到各个容器中的内容
2、析构函数 析构函数就不用多说了我们创建容器添加数据要在堆上开辟动态空间析构函数就是要来对这些开辟的空间进行释放的从而销毁容器对象。编译器会自动调用析构函数我们可以不用单独处理。
我们可以通过调试简单演示一下
程序结束前 程序结束后 程序结束自动调用析构销毁容器对象。
3、赋值重载 它的作用就是将 x 中的所有元素复制到容器中。
我们用代码来理解一下
void test_vector2()
{vectorint v1(2,6);vectorint v2(3,1);v2 v1;
}
调试结果 赋值前 赋值后 从这两张图可以看出当v2的size大小取决于v1如果v2在赋值前容量比v1大则赋值后保持不变否则会扩容保证能存放完v1的数据。
4、重载[]
因为vector的底层是动态数组所以它也支持用[]来访问指定下标的元素。
void test_vector3()
{vectorint v(6, 6);cout v[0] endl;cout v[2] endl;
}
在主函数中调用test_vector3()结果如下 如果越界访问就会报错。
这里也有3种遍历容器的方法和string差不多一样
void test_vector4()
{vectorint v1;vectorint v2(10, 1);vectorint v3(v2.begin(), --v2.end());//1、重载[]for (size_t i 0; i v3.size(); i){cout v3[i] ;}cout endl;//2、迭代器vectorint::iterator it v3.begin();while (it ! v3.end()){cout *it ;it;}cout endl;//3、范围forfor (auto e : v3){cout e ;}cout endl;
}
在主函数中调用test_vector4()结果如下 这3种迭代方法我们在string篇幅都已详细讲解了大家如果不懂可以看一下那篇文章。
5、扩容规律 我们可以看一下vector在添加元素时自动扩容的规律
void TestVectorExpand()
{size_t sz;vectorint v;sz v.capacity();cout capacity changed: sz \n;cout making v grow:\n;for (int i 0; i 100; i){v.push_back(i); //尾插if (sz ! v.capacity()){sz v.capacity();cout capacity changed: sz \n;}}
} 在主函数中调用TestVectorExpand()结果如下 不难发现它是从0开始扩的这与string是不同的它是严格的1.5倍扩容。
6、成员函数
成员函数中大多和string用法和功能一样这里只说一些特殊的。
(1)reserve()
它的功能是也是预留容量的也就是改变capacity的大小它可以避免频繁扩容。 size_type是一个无符号整形它和string中的reserve()成员函数相似但有一点不同我们先往下看假设参数是n(就是改变后的容量大小)分3种情况
1、n size
明确不会缩容。(这是和string不同的)
也不会改变size的大小就是不会破坏原有内容。
2、size n capacity
明确不会缩容。(这是和string不同的)
3、n capacity
会扩容至少扩到n也可能更多这是不确定的。
我们写一段代码验证一下:
void test_vector5()
{vectorint v(10, 1);cout v.size() endl;cout v.capacity() endl;//1、 n capacityv.reserve(20); cout v.size() endl;cout v.capacity() endl;//2、size n capacityv.reserve(15);cout v.size() endl;cout v.capacity() endl;//3、n sizev.reserve(5);cout v.size() endl;cout v.capacity() endl;
}
在主函数中调用test_vector5()结果如下 根据结果显示当n capacity时它是不会缩容的这是明确的。
(2)resize() 它是将size设置为n也分3种情况
1、n size
size的大小会变为n其余的size - n个元素被删除(摧毁)但capacity通常不变。
2、size n capacity
size的大小会变为n插入n - capacity个数据如果不给第二个参数那就用给的缺省值来初始化这n - capacity个数据如果value_type是自定义类型就调用它的默认构造如果想自己初始化这n - capacity个数据那么就手动给第二个参数赋值。
3、n capacity
会扩容至少扩到n也可能更多这是不确定的。在vs下通常会扩的更多一些。
对于前两点缩不缩容不一定这个需要看平台的处理。
我们写一段代码验证一下:
void test_vector6()
{vectorint v(3, 1);v.reserve(8); //提前预留8字节空间cout v.size() endl;cout v.capacity() endl;//1、n sizev.resize(1);cout v.size() endl;cout v.capacity() endl;//2、size n capacityv.resize(5, 3); //多余的n - size个数的数据初始化为3cout v.size() endl;cout v.capacity() endl;//3、size capacityv.resize(10,100);//多余的n - size个数的数据初始化为100cout v.size() endl;cout v.capacity() endl;
} 在主函数中调用test_vector6()结果如下 大家对比上面的3点进行理解。
(3)insert()
这里的insert比string当中的insert简洁了许多。 它在这不支持下标了只支持迭代器。
void test_vector7()
{ vectorint v2(2, 0);vectorint v1(5, 1);for (auto e : v1)cout e ;cout endl;v1.insert(v1.begin(), 0); //(1)在v1头部位置插入0for (auto e : v1)cout e ;cout endl;v1.insert(v1.begin() 3, 3, 100); //(2)在v1下标为3的位置上插入3个100for (auto e : v1)cout e ;cout endl;v1.insert(v1.end(), v2.begin(), v2.end());//(3)在v1的末尾插入一段迭代区间for (auto e : v1)cout e ;cout endl;
} 在主函数中调用test_vector7()结果如下 它不直接支持下标但间接却是支持的因为用迭代器就可以实现下标的问题假设你要在下标为3的位置插入数据那迭代器 v.begin() 3就可以实现。这里没有用下标更多的原因是和后面的容器进行兼容像list它的底层不是动态数组用下标访问就是不合适的。所以我们在容器这一部分统一都用迭代器。 (4)erase() 同时它也是只支持用迭代器来进行相应位置数据删除。
7、其他
vector不支持流插入和流提取因为它的打印形式是多样的不像string那样是固定的遇到\0就终止打印vector不支持流插入和流提取方便了我们对打印形式的控制更自由和灵活。
vector底层是动态数组string底层也是动态数组那vectorchar 可以等同于string吗
答案是不能。
首先string定义的对象后面默认有\0vectorchar没有其次string定义的对象可以用字符串进行初始化vectorchar不能接着string有很多针对字符串具有特定功能的接口vector却没有最后string可以进行一些接口的传参如果换用vectorchar则会麻烦许多。
所以vectorchar 是不可以取代string的。
三、结语
以上就是本篇的全部内容了主要讲了vector的基本使用希望大家有所收获祝大家天天开心