余姚做网站的公司,dz论坛网站后台设置,wordpress调用随机文章代码,网站建设 百度推广文章目录 前言1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.3 vector 增删查改1.2.4 vector 迭代器失效问题。#xff08;重点!!!!!!#xff09;1.2.5 vector 在OJ中有关的练习题 2.ve… 文章目录 前言1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.3 vector 增删查改1.2.4 vector 迭代器失效问题。重点!!!!!!1.2.5 vector 在OJ中有关的练习题 2.vector深度剖析及模拟实现2.1 std::vector的核心框架接口的模拟实现dzj::vector 本文章内容后续会完善一些总结 前言
提示这里可以添加本文要记录的大概内容
C中的vector是一个强大而灵活的动态数组容器它提供了在运行时动态增长和收缩的能力极大地简化了数组的管理。vector是标准模板库STL中的一部分为程序员提供了高效的数据存储和操作方式。在本博客中我们将深入介绍vector的基本用法并进行深度剖析和模拟实现以帮助你更好地理解和利用这一重要的C容器。 提示以下是本篇文章正文内容下面案例可供参考
1.vector的介绍及使用
1.1 vector的介绍
vector文档介绍
vector是一个动态数组容器它以模板类的形式实现能够存储同一类型的元素。其最显著的特点之一是能够在运行时动态调整数组大小而不需要手动管理内存。通过push_back()进行元素的追加、pop_back()进行末尾元素的删除以及使用迭代器进行元素的遍历vector提供了简单而强大的操作方式。 vector的内部实现采用动态数组这意味着它能够在需要时自动分配更多的内存空间以适应元素的增加。这种机制确保了vector的高效性使得它适用于各种规模和类型的数据集。
参考文献 Josuttis, N. M. (2007). The C Standard Library: A Tutorial and Reference (2nd Edition). Addison-Wesley. Stroustrup, B. (2013). The C Programming Language (4th Edition). Addison-Wesley. Meyers, S. (2001). Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library. Addison-Wesley.
1.2 vector的使用
vector学习时一定要学会查看文档vector文档介绍vector在实际中非常的重要在实际中我们熟悉常见的接口就可以下面列出了哪些接口是要重点掌握的。
1.2.1 vector的定义 #define _CRT_SECURE_NO_WARNINGS 1#include iostream
#include vector
using namespace std;
int main()
{vectorint v1;//无参构造v1.push_back(0);v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.push_back(6);for (int i 0; i v1.size(); i){cout v1[i] ;}cout endl;vectorint v2(v1);v2.push_back(8);v2.push_back(8);v2.push_back(8);for (int i 0; i v2.size(); i){cout v2[i] ;}cout endl;return 0;
}1.2.2 vector iterator 的使用 图解
#include iostream
#include vector
using namespace std;
void Print1(const vectorintv)//正向遍历
{vectorint::const_iterator it v.begin();while (it ! v.end()){cout *it ;it;}cout endl;
}
void Print2(const vectorint v)//反向遍历
{vectorint::const_reverse_iterator it v.rbegin();while (it ! v.rend()){cout *it ;it;}cout endl;
}
int main()
{vectorint v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.push_back(6);Print1(v1);Print2(v1);// 使用迭代器进行修改vectorint::iterator it v1.begin();while (it ! v1.end()){*it * 2;it;}Print1(v1);Print2(v1);return 0;
}1.2.3 vector 空间增长问题 capacity的代码在vs和g下分别运行会发现vs下capacity是按1.5倍增长的g是按2倍增长的。 这个问题经常会考察不要固化的认为顺序表增容都是2倍具体增长多少是根据具体的需求定义 的。vs是PJ版本STLg是SGI版本STL。 reserve只负责开辟空间如果确定知道需要用多少空间reserve可以缓解vector增容的代价缺陷问题。 resize在开空间的同时还会进行初始化影响size。 // vector::capacity
#include iostream
#include vector
using namespace std;
int main()
{vectorint v;cout making v growing!!!! endl;cout capacity changed: v.capacity() endl;for (int i 0; i 100; i){v.push_back(i);if (v.size() v.capacity())cout capacity changed: v.capacity() endl;}return 0;
}运行结果
// vector::reserve
#include iostream
#include vector
using namespace std;
int main()
{vectorint v;for (int i 0; i 100; i){v.push_back(i);}cout size: v.size()endl;cout capacity: v.capacity()endl;v.reserve(200);cout size: v.size() endl;cout capacity: v.capacity() endl;return 0;
}运行结果
// vector::resize
#include iostream
#include vector
using namespace std;
int main()
{vectorint v;//for (int i 0; i 100; i)//{// v.push_back(i);//}cout size: v.size()endl;cout capacity: v.capacity()endl;v.resize(200);cout size: v.size() endl;cout capacity: v.capacity() endl;v.resize(100);cout size: v.size() endl;cout capacity: v.capacity() endl;v.resize(101,8);cout size: v.size() endl;cout capacity: v.capacity() endl;for (auto e : v){cout e ;}return 0;
}运行结果
1.2.3 vector 增删查改 // push_back/pop_back
#include iostream
#include vector
using namespace std;
int main()
{int arr[] { 1,2,3,4 };vectorint v(arr, arr sizeof(arr) / sizeof(arr[0]));v.push_back(5);v.push_back(6);vectorint::iterator it v.begin();while (it ! v.end()){cout *it ;it;}cout endl;v.pop_back();v.pop_back();it v.begin();while (it ! v.end()){cout *it ;it;}return 0;
}
// push_back/pop_back运行结果
// find / insert / erase
#include iostream
#include vector
using namespace std;
int main()
{vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vectorint::iterator pos find(v.begin(), v.end(), 3);v.insert(pos, 0);for (auto e : v){cout e ;}cout endl;pos find(v.begin(), v.end(), 3);v.erase(pos);for (auto e : v){cout e ;}return 0;
}运行结果
// operator[]index 和 C11中vector的新式forauto的遍历
// vector使用这两种遍历方式是比较便捷的。
#include iostream
#include vector
using namespace std;
int main()
{vectorint v { 1,2,3,4 };//operator[]indexfor (int i 0; i v.size(); i){cout v[i] ;}cout endl;for (int i 0; i v.size(); i){v[i] * 2;}vectorint swapv;swapv.swap(v);for (auto e : swapv){cout e ;}return 0;
}运行结果
1.2.4 vector 迭代器失效问题。重点!!! 迭代器的主要作用就是让算法能够不用关心底层数据结构其底层实际就是一个指针或者是对指针进行了所谓的封装比如vector的迭代器就是原生态指针T*。因此迭代器失效实际就是迭代器底层对应指针所指向的空间被销毁了而使用一块已经被释放的空间造成的后果是程序崩溃(即如果继续使用已经失效的迭代器程序可能会崩溃)。 对于vector可能会导致其迭代器失效的操作有 会引起其底层空间改变的操作都有可能是迭代器失效比如resize、reserve、insert、assign、 push_back等。
#include iostream
#include vector
using namespace std;
int main()
{vectorint v { 1,2,3,4 };auto it v.begin();while (it ! v.end()){cout *it ;it;}v.reserve(100);while (it ! v.end()){cout *it ;it;}return 0;
}运行错误 出错原因以上操作都有可能会导致vector扩容也就是说vector底层原理旧空间被释放掉而在打印时it还使用的是释放之间的旧空间在对it迭代器操作时实际操作的是一块已经被释放的空间而引起代码运行时崩溃。 解决方式在以上操作完成之后如果想要继续通过迭代器操作vector中的元素只需给it重新赋值即可。
2. 指定位置元素的删除操作–erase
#include iostream
using namespace std;
#include vector
int main()
{int a[] { 1, 2, 3, 4 };vectorint v(a, a sizeof(a) / sizeof(int));// 使用find查找3所在位置的iteratorvectorint::iterator pos find(v.begin(), v.end(), 3);// 删除pos位置的数据导致pos迭代器失效。v.erase(pos);cout *pos endl; // 此处会导致非法访问return 0;
}
erase删除pos位置元素后pos位置之后的元素会往前搬移没有导致底层空间的改变理论上讲迭代器不应该会失效但是如果pos刚好是最后一个元素删完之后pos刚好是end的位置而end位置是没有元素的那么pos就失效了。因此删除vector中任意位置上元素时vs就认为该位置迭代器失效了。 迭代器失效解决办法在使用前对迭代器重新赋值即可 1.2.5 vector 在OJ中有关的练习题
只出现一次的数字i杨辉三角OJ删除排序数组中的重复项 OJ只出现一次的数ii OJ只出现一次的数iii OJ数组中出现次数超过一半的数字 OJ电话号码字母组合OJ连续子数组的最大和 OJ
2.vector深度剖析及模拟实现 2.1 std::vector的核心框架接口的模拟实现dzj::vector 模拟实现代码 本文章内容后续会完善一些
总结
通过本文的阅读我们详细了解了C中vector的基本概念、使用方法和一些关键特性。从动态数组的角度深度剖析了vector的内部机制以及通过模拟实现进一步加深了对其工作原理的理解。vector的灵活性和高效性使其成为C编程中不可或缺的工具无论是在简单的数组操作还是复杂的数据结构中都能展现其强大的应用价值。通过学习和研究vector我们能够更好地优化代码、提高程序的效率为C编程带来更多便利。希望本文对你在使用和理解C中的vector时有所帮助。