【C++】STL详解(三)—vector使用手册:不看你会后悔
存储方式与数组一样vector使用连续内存空间存储元素因此可以通过下标随机访问时间复杂度为O(1)。动态扩容与普通数组不同vector的大小可以动态改变。当空间不足时会分配新的更大内存把原有元素拷贝过去再释放旧空间。空间策略vector会预留额外空间来减少频繁扩容。不同实现的扩容策略不同但通常是以倍数方式增长从而保证均摊插入复杂度为O(1)。性能特点访问元素效率高支持随机访问。在末尾插入/删除效率高。在中间或开头插入/删除效率低需要移动大量元素。 一句话总结vector是 C 中最常用的容器本质是一个能自动扩容的动态数组既有数组的高效访问又比数组更灵活。二、vector的使用1.vector的定义方式构造一个空的 vector任意类型注意这只是一个示例注意是任意类型不止如下的类型代码语言javascriptAI代码解释vectorint v1; //构造int类型的空容器 vectordouble v2; //构造double类型的空容器 vectorchar v3; //构造char类型的空容器 vectorstring v4; //构造string类型的空容器构造一个含有 n 个元素的 vector每个元素的值都是 valvector类型 v1(n个元素值val);代码语言javascriptAI代码解释vectorint v1(10,2); vectordouble v2(10,0.0); vectorchar v3(10,d);拷贝构造函数用已有的 vector 构造新的 vector代码语言javascriptAI代码解释vectorint v1(v2); //拷贝构造int类型的v2容器的复制品用区间 [first, last) 中的元素构造 vector代码语言javascriptAI代码解释vectorint v2(v1.begin(), v1.end()); //使用迭代器拷贝构造v2容器的某一段内容在这里插入图片描述2.迭代器的使用在vector中迭代器的底层实现通常就是一个普通指针因为vector的元素存储在连续的内存空间里用指针就能完成迭代器的所有功能。因此在vector阶段迭代器本质上等同于指针。但在其他容器如list、map中元素存储方式不同不一定是连续内存这时迭代器并不是单纯的指针而是一个封装了指针行为的类对象通过运算符重载来模拟“像指针一样使用”。begin和endbegin函数可以得到容器中第一个元素的正向迭代器通过end函数可以得到容器中最后一个元素的下一个位置的正向迭代器。在这里插入图片描述代码语言javascriptAI代码解释int main() { vectorint v(6, 6); vectorint::iterator it v.begin(); while (it ! v.end()) { cout *it ; it; } cout endl; return 0; }此处仅展示普通vector对象的迭代器使用因为容器的迭代器的使用都是相通的在这里插入图片描述rbegin和rendrbegin函数可以得到容器中最后一个元素的反向迭代器通过rend函数可以得到容器中第一个元素的前一个位置的反向迭代器在这里插入图片描述代码语言javascriptAI代码解释int main() { vectorint v1; v1.push_back(5); v1.push_back(2); v1.push_back(0); vectorint::reverse_iterator rit v1.rbegin(); while (rit ! v1.rend()) { cout *rit ; rit; } return 0; }运行结果如下:在这里插入图片描述3.空间的增长问题size和capacity通过size函数获取当前容器中的有效元素个数通过capacity函数获取当前容器的最大容量。代码语言javascriptAI代码解释#includeiostream #includevector using namespace std; void test01() { vectorint v1(6, 6); cout size: v1.size() endl;//获取当前容器有效数据个数 cout capacity: v1.capacity() endl;//获取当前容器最大容量 } int main() { test01(); return 0; }运行结果如下在这里插入图片描述reserve和reszie函数作用规则reserve改变容器的 容量 (capacity)1. 当所给值 当前 capacity 时扩容到该值。2. 当所给值 ≤ 当前 capacity 时不做任何操作。resize改变容器的 有效元素个数 (size)1. 当所给值 当前 size 时扩展 size 到该值新增元素为指定值默认 0。2. 当所给值 当前 size 时缩小 size 到该值超出部分元素被移除。代码语言javascriptAI代码解释#includeiostream #includevector using namespace std; void test01() { vectorint v1(6, 6); cout size: v1.size() endl;//获取当前容器有效数据个数 6 cout capacity: v1.capacity() endl;//获取当前容器最大容量 6 v1.reserve(20);//修改容器最大容量为20 cout size: v1.size() endl;//6 cout capacity: v1.capacity() endl;//20 v1.resize(10); cout size: v1.size() endl;//10,剩余空间默认为0 cout capacity: v1.capacity() endl;//10 v1.resize(15,8); cout size: v1.size() endl;//15,剩余空间补8 cout capacity: v1.capacity() endl;//15 } int main() { test01(); return 0; }运行结果如下在这里插入图片描述empty通过empty函数判断当前容器是否为空。代码语言javascriptAI代码解释#includeiostream #includevector using namespace std; void test02() { vectorint v2(6, 6); vectorint v3; cout v2: v2.empty() endl; cout v3: v3.empty() endl; } int main() { test02(); return 0; }运行结果如下在这里插入图片描述4.vector增删查改push_back和pop_back通过push_back函数对容器进行尾插pop_back函数对容器进行尾删。代码语言javascriptAI代码解释#includeiostream #includevector using namespace std; void test03() { vectorint v1; v1.push_back(5); v1.push_back(2); v1.push_back(0); v1.push_back(1); v1.push_back(3); v1.push_back(1); v1.push_back(4); v1.pop_back(); v1.pop_back(); } int main() { //test01(); //test02(); test03(); return 0; }代码运行如下在这里插入图片描述在这里插入图片描述insert和erase通过insert函数可以在所给迭代器pos位置插入一个或多个元素通过erase函数可以删除所给迭代器pos位置的元素或删除所给迭代器区间内的所有元素左闭右开。代码语言javascriptAI代码解释#includeiostream #includevector using namespace std; void test04() { vectorint v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.insert(v.begin(), 0); //在容器开头插入0 v.insert(v.begin(), 5, -1); //在容器开头插入5个-1 v.erase(v.begin()); //删除容器中的第一个元素 v.erase(v.begin(), v.begin() 5); //删除在该迭代器区间内的元素左闭右开 return 0; } int main() { //test01(); //test02(); //test03(); test04(); return 0; }运行结果如下在这里插入图片描述在这里插入图片描述以上是按位置进行插入或删除元素的方式若要按值进行插入或删除在某一特定值位置进行插入或删除则需要用到find函数。 find函数 find函数共三个参数前两个参数确定一个迭代器区间左闭右开第三个参数确定所要寻找的值。 find函数在所给迭代器区间寻找第一个匹配的元素并返回它的迭代器若未找到则返回所给的第二个参数
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411984.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!