当vector使用erase 数组长度是不是改变

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当vector使用erase 数组长度是不是改变相关的知识,希望对你有一定的参考价值。

要改变,数组元素的位置也要改变 。追问

比如删除一个元素,那么改变之后是不是删除位置以后的元素都前移一位,容器大小减一?

追答

是的。

参考技术A vector的erase方法会改变数组长度,
不过要注意的是通用算法remove将不改变容器大小
参考技术B 改变 参考技术C vector的容器大小用max_size来看吗?

(C++)变长数组vector的常见用法

目录

1. vector的定义

2. vector内的元素访问

3. vector常用函数

push_back(x)

pop_back()

size()

clear()

insert(it,x)

erase(it)和erase(first,last)

4. vector常见用途

1.存储数据

2.用邻接表存储图


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常用函数

  1. 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;
    }
  2. 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;
    }
  3. size()

    作用:得到vector的大小
  4. clear()

    作用:清空vector
    int main(){
    	
    	vector<int> vi;
    	
    	for(int i=0;i<5;i++){
    		vi.push_back(i);
    	}
    	
    	vi.clear();
    	
    	printf("%d",vi.size());
    			
    	return 0;
    }
  5. 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;
    }
  6. 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 数组长度是不是改变的主要内容,如果未能解决你的问题,请参考以下文章

vector::erase

vector

关于vector的自我补充

C++ vector容器中用erase函数和迭代器删除重复元素问题分析

vector的使用方法

vector 去重