STL容器vector
一、什么是Vector
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
二、定义和初始化Vector对象
//初始化vector对象的方法
vector<T> V1;
vector<T> v2(v1);
vector<T> v3 = v2;
vector<T> v4(n, val);
vector<T> v5(n);
vector<T> v6{a, b, c};
vector<T> v7 = {1, 2, 3};
三、增加函数
void push_back(const T& x);
//向量尾部增加一个元素X
iterator insert(iterator it,const T& x);
//向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x);
//向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last);
//向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
1、使用push_back,将一个元素追加到vector的尾部
#include <iostream>
#include<string>
#include<vector>
using namespace std; int main(){
vector<string> v1;
string str;
while(cin >> str){
v1.push_back(str);
}
for(auto x : v1){ //范围for语句
cout << x << " ";
}
cout << endl;
return 0;
}
2、insert函数允许在容器任何位置插入一个或多个元素,每个Insert函数接收迭代器作为其第一个参数,指出在容器什么位置放置新元素。
#include <iostream>
#include<string>
#include<vector>
using namespace std; int main(){
vector<string> v1;
vector<string> v2 = {"z3", "w5", "y2"};
string str; v1.insert(v1.begin(), "Hello");
v1.insert(v1.end(), 3, "World"); //插入范围元素
v1.insert(v1.begin(), v2.begin(), v2.end()); //接收一对迭代器,将范围中的元素插入 for(auto x : v1){
cout << x << " ";
}
cout << endl;
return 0;
}
通过insert的返回值,可以在一个特定位置反复插入元素
四、删除函数
iterator erase(iterator it);//删除向量中迭代器指向元素
iterator erase(iterator first,iterator last);//删除向量中[first,last)中元素
void pop_back();//删除向量中最后一个元素
void clear();//清空向量中所有元素
1、删除vector中所有奇数元素
#include <iostream>
#include<vector>
using namespace std; int main(){ vector<int> v1 = {1, 2, 3, 4, 5};
auto it = v1.begin();
while(it != v1.end()){
if(*it % 2) it = v1.erase(it);
else ++it;
} for(auto x : v1){
cout << x << " ";
}
cout << endl;
return 0;
}
2、删除一个范围内的所有元素
五、其他函数
void swap(vector&);//交换两个同类型向量的数据
void assign(int n,const T& x);//设置向量中前n个元素的值为x
void assign(const_iterator first,const_iterator last);//向量中[first,last)中元素设置成当前向量元素
六、迭代器失效
迭代器失效是指迭代器底层对应的指针所指的空间无效了,而使用一块已经被释放的空间,造成的后果是程序崩溃。
1、扩容导致迭代器失效。vector插入元素可能会导致容量不足,会触发扩容,导致整个vector重新申请内存,并且将原有的数据复制到新的内存中,并将原有内存释放,迭代器所指的内存释放,迭代器失效。
#include <iostream>
#include<vector>
using namespace std; int main(){ vector<int> v1;
v1.push_back(6);
v1.push_back(9);
auto it = v1.begin(); cout << "v1的容量为:" << v1.capacity() << endl; //容量为2
cout << *it << endl; v1.push_back(10); //扩容,迭代器失效
v1.push_back(5);
cout << "v1的容量为:" << v1.capacity() << endl;
cout << *it << endl;
return 0;
}
2、insert导致迭代器失效
#include<iostream>
#include<vector>
using namespace std; int main()
{
vector<int> ta;
for (int i = 0; i < 13; i++)
{
ta.push_back(i);
} vector<int>::iterator it = ta.begin(); it += 5; cout << "容量是 " << ta.capacity() << endl;
cout << "it的值是 " << *it << endl;
ta.insert(it, 100); cout << "insert后容量是 " << ta.capacity() << endl;
cout << "此时it指向的值是 " << *it << endl; return 0;
}
3、erase导致迭代器失效
#include<iostream>
using namespace std;
#include<vector> int main()
{
vector<int> ta;
for (int i = 0; i < 10; ++i)
{
ta.push_back(i);
} vector<int>::iterator it = ta.begin(); it += 5;
cout << "容量是 " << ta.capacity() << endl;
cout << "it的值是 " << *it << endl; ta.erase(it); //迭代器失效
cout << "erase后容量是 " << ta.capacity() << endl;
cout << "此时it指向的值是 " << *it << endl; return 0;
}
对于序列式容器,比如vector,插入删除当前的iterator会使后面所有元素的iterator都失效。
STL容器vector的更多相关文章
- 从零开始写STL—容器—vector
从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
- [C++]STL容器Vector的内存释放
直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...
- STL容器vector应用注意事项
[1]提前分配足够空间以免不必要的重新分配和复制代价 关于vector容器重新分配和复制及析构释放的代价,请参见随笔<STL容器之vector>. 应用示例对比代码如下: #include ...
- STL容器 vector,list,deque 性能比较
C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差 ...
- STL容器 -- Vector
核心:Vector 是 STL 里的一个向量容器,可以像数组那样进行随机访问,能在尾部插入元素,对于元素的删除和插入可以动态管理内存. 头文件: #include <vector> 构造函 ...
- STL - 容器 - vector简单应用
VectorTest.cpp #include <vector> #include <iostream> #include <string> #include &l ...
- ACM常用STL容器
// STL(标准模板库),由三大部分组成:容器,算法,迭代器 // STL六大组件:container(容器),algorthm(算法),iterator(迭代器) // function obje ...
- 跟我一起学STL(2)——vector容器详解
一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
随机推荐
- 六、dockerfile
一.什么是镜像 镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加. 根据上 ...
- SpringBoot(三) - Ribbon客户端负载均衡,Zuul网关,Config配置中心
1.Ribbon客户端负载均衡 1.1 依赖 1.2 配置信息 # feign默认加载了ribbon负载均衡,默认负载均衡机制是:轮询 # 负载均衡机制是添加在消费端(客户端)的,如果改为随机,指定服 ...
- ES6 学习笔记(九)Set的基本用法
1 基本用法 set类似于数组,它的成员是唯一的,当有多个相同的值,只会保留一份. 1.1 创建方法 Set本身是一个构造函数,用来生成Set实例,如: const s = new Set() let ...
- ISCTF2022WP
ISCTF2022改名叫套CTF吧(bushi),博主菜鸡一个,套题太多,挑一些题写下wp,勿喷. MISC 可爱的emoji 下载下来是个加密压缩包,根据hint掩码爆破密码 得到密码:KEYI ...
- 树上启发式合并(dsu on tree)
树上启发式合并属于暴力的优化,复杂度O(nlogn) 主要解决的问题特点在于: 1.对于树上的某些信息进行查询 2.一般问题的解决不包含对树的修改,所有答案可以离线解决 算法思路:这类问题的特点在于父 ...
- C++初阶(类的访问权限以及封装+this指针+构造函数+析构函数+拷贝构造函数+参数列表+友元+内部类)
面向过程与面向对象 C语言是面向过程的,关注的是过程(函数),分析出求解问题的步骤,通过函数调用逐步解决问题. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成. ...
- 专业的C头文件设计和重构指南
头文件设计要点: 1. 头文件注释 2. guard define 3. 尽量不要在头文件中暴露数据结构 4. 要自包含,保证头文件独立编译和功能正确 5. 函数声明前加XXX_API利于拓展 6. ...
- bugku 计算器
打开就一个输入框和验证,尝试后发现输入框限制了位数,这还不简单,F12直接修改表单长度试试 成功得到flag
- C++ 动态规划:一维动态规划,背包问题,区间动态规划
C++ 动态规划 动态规划的定义 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程.动态规划是一种在数学.管理科学.计算机科学.经济学和生物信息学 ...
- Docker定时删除none镜像
在使用docker的时候会产生none镜像文件,偶尔没什么,但是比如使用了自动化部署工具那就不一样了,一天没准就上百个none镜像了,非常消耗资源,所以需要定时清理 删除 none 镜像命令 dock ...