指针原来是套娃的


私信TA

用户名:uq_92467646842

访问量:42829

签 名:

数学改变科学,科学改变世界

等  级
排  名 10
经  验 25094
参赛次数 49
文章发表 128
年  龄 0
在职情况 学生
学  校
专  业 物联网工程

  自我简介:

QQ:2830671713

解题思路:

最简单的方法是在给数组赋值的时候忽略0,或者在打印输出的时候忽略0,但是这样就和题目意思不符了。

对于一个数组的元素删除是很麻烦的,删除一个数以后需要将后面的元素向前补齐,实现麻烦。

在c++ 的stl里面提供了动态数组vector ,提供了数组的删除方法。

vector是标准库中常见的一种容器,使用起来非常方便,可以用来代替c++原本的数组。

需要使用头文件#include <vector>

常见的操作有:

vector<int>p;//创建动态数组p

p.push_back(k);//依次在p中放入值

p.size()获取数组的长度

使用[]访问获取数组内的值

对于动态数组的删除是使用.erase()方法,例如:

for(vector<int>::iterator it=p.begin();it<p.end();){//使用迭代器访问数组内元素
		if(*it==0)p.erase(it);//如果数组内元素等于0,就删除这个元素
	}

但是这样对于1 0 2 0 3这种形式是可行的,但是对于1 0 0 2 0这种形式,数组内的元素最终是1 0 2,有一个0被没有被清除掉。

原因是迭代器失效:在第一个0被erase掉的时候,it迭代器已经失效了,用它来继续遍历vector就会漏掉被删除元素后面的第一个元素,导致0没有被完全清除。

因为erase函数的返回值是指向当前被删除元素的下一个元素的迭代器,所以我们可以通过将这个返回值赋给it进行解决。

for(vector<int>::iterator it=p.begin();it<p.end();){
		if(*it==0)it=p.erase(it);//删除it以后将返回值(被删除元素的下一个元素的迭代器)赋值给it
		else it++;//没有删除元素,正常向下+1寻找
	}


参考代码:

#include <bits/stdc++.h>

#define ll long long
using namespace std;

int main()
{
	vector<int>p;
	ll i,n,k=0,z=0;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>k;
		p.push_back(k);
	}
	for(vector<int>::iterator it=p.begin();it<p.end();){
		if(*it==0)it=p.erase(it);
		else it++;
	}
	cout<<p.size()<<endl;
	for(vector<int>::iterator it=p.begin();it<p.end();it++){
		cout<<*it<<" ";
	}
	
    return 0;
}


 

0.0分

140 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答

代码解释器

  评论区