当vector使用erase 数组长度是不是改变
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当vector使用erase 数组长度是不是改变相关的知识,希望对你有一定的参考价值。
要改变,数组元素的位置也要改变 。追问比如删除一个元素,那么改变之后是不是删除位置以后的元素都前移一位,容器大小减一?
追答是的。
参考技术A vector的erase方法会改变数组长度,不过要注意的是通用算法remove将不改变容器大小 参考技术B 改变 参考技术C vector的容器大小用max_size来看吗?
(C++)变长数组vector的常见用法
目录
1. vector的定义
1.1 单独定义vector
vector<typename> name;
其中typename可以是基本类型,如
vector<int> vi_1;
vector<double> vi_2;
vector<char> vi_3;
也可以是结构体,如
struct fraction{
int son;
int mom;
}
vector<fraction> vi;
还可以是一个STL容器(可以理解成能实现很多功能的东西),比如vector自身
vector<vector<int> > vi;//注意> >中间的空格不能少
1.2 定义vector数组
vector<typename> Arrayname[arraySize];
vector<int> vi[100];
注意:这里定义的二维数组,一维是定长,一维是变长。上面的两维都是变长。
2. vector内的元素访问
2.1 通过下标访问,和对待普通数组一样
vi[idx]//idx取值范围是[0,vi.size()-1]
2.2 通过迭代器访问
可以把迭代器理解成指针,只不过定义有点长
vector<typename>::iterator it;//typename需要和所指的vector保持一致
//例如
vector<int>::iterator it;
vector<double>::iterator it;
并通过*it访问vector里的元素
vector<int>::iterator it = vi.begin();//向量vi的首元素地址
printf("%d",*it);
可以看出 vi[i] 和 *(vi.begin()+i)是等价的
注意,vi.end()并不是取尾元素地址,而是它的下一个地址,也就是不存储任何元素。
此外,迭代器不支持 it < vi.end() 的写法,但是支持自增和自减操作。
下面是用迭代器遍历vector。
for(vector<int>::iterator it = vi.begin();it!=vi.end();it++){
printf("%d",*it);
}
注:所有的STL容器中,只有vector和string支持 vi.begin()+3这种迭代器加上整数的写法。
3. vector常用函数
-
push_back(x)
作用:加尾int main(){ vector<int> vi; for(int i=0;i<5;i++){ vi.push_back(i); } for(vector<int>::iterator it = vi.begin();it!=vi.end();it++){ printf("%d",*it); } return 0; }
-
pop_back()
作用:去尾int main(){ vector<int> vi; for(int i=0;i<5;i++){ vi.push_back(i); } vi.pop_back(); for(int i=0;i<vi.size();i++){ printf("%d",vi[i]); } return 0; }
-
size()
作用:得到vector的大小 -
clear()
作用:清空vectorint main(){ vector<int> vi; for(int i=0;i<5;i++){ vi.push_back(i); } vi.clear(); printf("%d",vi.size()); return 0; }
-
insert(it,x)
作用:将x插到迭代器it所在处int main(){ vector<int> vi; for(int i=0;i<5;i++){ vi.push_back(i); } vector<int>::iterator it = vi.begin()+1; vi.insert(it,99); for(int i=0;i<vi.size();i++){ printf("%d ",vi[i]); } return 0; }
-
erase(it)和erase(first,last)
作用:删除迭代器it所在处元素/删除区间[fisrt,last)内的元素(含头不含尾)int main(){ vector<int> vi; for(int i=0;i<5;i++){ vi.push_back(i);//0 1 2 3 4 } vector<int>::iterator it = vi.begin(); vi.erase(it+1,it+4);//还剩0和4 for(int i=0;i<vi.size();i++){ printf("%d ",vi[i]); } return 0; }
4. vector常见用途
1.存储数据
适用于数据个数不确定的场景
2.用邻接表存储图
以上是关于当vector使用erase 数组长度是不是改变的主要内容,如果未能解决你的问题,请参考以下文章