指针原来是套娃的


私信TA

用户名:uq_92467646842

访问量:53458

签 名:

个人博客:blog.imtwa.top

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

  自我简介:

解题思路:

最简单的方法是在给数组赋值的时候忽略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分

156 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »