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. ...
随机推荐
- 秀++视频算法仓库-厂家对接规约V5
一.概要 (1)每个算法厂家在秀++云平台上会有一个厂商标识,譬如CS101:算法厂家可能有多个算法引擎,每个引擎有一个标识譬如Q101,引擎可以理解为一个可执行程序,可以同时分析多路算法:每个算法在 ...
- HMM算法python实现
基础介绍,后5项为基础5元素 Q = ['q0', 'q1', 'q2', 'q3'] # 状态集合 States,共 N 种状态 V = ['v0', 'v1'] # 观测集合 Observatio ...
- mybatis一对多映射分页的问题
一对多可能会出现分页错误 条数不对的问题 解决方法: 将主表分页查询一次 SELECT aa.id,aa.name,bb.name FROM (SELECT * from tab1 ORDER BY ...
- 什么是CLR?
CLR翻译为"公共语言运行库",全称是Common Language Runtime,它是一个可以由多种语言使用的"运行时",CLR的核心功能如内存管理,程序集 ...
- 32bit和64bit系统的区别,运行机制浅析
32bit:内存的最大寻址空间是2^32=4G,就是说32位系统的处理器最大只支持到4G内存 64bit:内存的最大寻址空间是2^64,大于1亿GB,但是实际上支持不到那么大的内存,大概是2^40+ ...
- [linux]非root账户 sudo cd 无法切换目录解决办法
在Centos上有个账户A(非root),有sudo权限(权限比较大),想要用 cd 命令切换到 B账号的 /home/B 下的目录,结果没作用 [liuzz ~]$ sudo cd /home/xi ...
- thinkphp6的主要特性
采用PHP7强类型(严格模式) 支持更多的PSR规范 多应用支持 ORM组件独立 改进的中间件机制 更强大和易用的查询 全新的事件系统 支持容器invoke回调 模板引擎组件独立 内部功能中间件化 S ...
- 二分查找-LeetCode704 简单题
LeetCode代码链接:https://leetcode.cn/problems/binary-search/ 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ...
- hexo-通过-metaweblog-api-同步各大博客网站
闲聊 不多逼逼了.上干货 如何写一篇文章同步到多个博客网站 最近通过hexo 建立了博客网站,发现流量少的可怜,那把文章发到各个博客网站呢,我又懒那通过一番研究 终于搞定了通过MetaWebLog A ...
- 【每日一题】【暴力、动态规划、动规优化、贪心】2022年1月21日-NC19 连续子数组的最大和/最大子序和
同:最大子序和 https://www.cnblogs.com/liujinhui/p/15574312.html 描述输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组. ...