【每日一记】算法学习3——vector与结构体

一、vector

1.简单介绍

vector是STL容器,和数组非常像,但vector可以被理解为动态数组,即会自己分配内存的数组。

2.使用

使用之前需要先加入一个头文件:

#include <vector>

vector的函数非常丰富,很多都是打包好的,比较好用^ - ^

函数名功能
push_back(元素)添加一个元素到后面,时间复杂度O(1)
pop_back()弹出最后一个元素,复杂度O(1)
insert(位置, 元素)插入元素至指定位置,复杂度O(n)(实际中接近O(logn))
erase(位置)删除向量指定位置的元素
clear()清除向量中所有的元素
v[x]类似于数组下标,访问向量的第x个元素
front()取向量的第一个元素
back()取向量最后一个元素
begin()向量的第一个元素的位置,返回第一个元素迭代器
end()返回最后一个元素的后面的位置(不是最后一个元素的迭代器)
size()向量中元素个数
resize(大小)重新设定向量的大小,即可以保存多少个元素
empty()判断向量是否为空

(1)begin()和end()

vector<int>::iterator it = v.begin();
//v.begin()为取v的首元素地址,而it指向这个地址(与指针差不多),相当于v[0]
//v[i]和*(v.begin()+i)是等价的

说明:常用STL容器中,只有vector和string允许使用"v.begin()+3"这种迭代器加上整数的写法

(2)push_back()

vector<int> v;
v.push_back(1);//向向量末尾放入元素

(3) size()和resize()

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	ios::sync_with_stdio(0);  //输入输出优化
	
	vector<int> v;
	for (int i = 1; i <= 3; i ++)
	{
		v.push_back(i);
	}
	cout << v.size() << endl;  //此刻v.size()为3
	v.resize(5);
	cout << v.size() << endl;  //此刻v.size()为5,多则补,少则删
	
	return 0;
}

(4) pop_back()

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	ios::sync_with_stdio(0);
	
	vector<int> v;
	for (int i = 1; i <= 3; i ++)
	{
		v.push_back(i);
	}
	for (int i = 0; i < v.size(); i ++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	
	v.pop_back();  //末尾弹出一个元素
	for (int i = 0; i < v.size(); i ++)
	{
		cout << v[i] << " ";
	} 
	
	return 0;
}

运行结果

(5)insert()和erase()

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	ios::sync_with_stdio(0);
	
	vector<int> v;
	for (int i = 1; i <= 3; i ++)
	{
		v.push_back(i);
	}
	for (int i = 0; i < v.size(); i ++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	
	v.insert(v.begin(), 5);     //注意第一个要是迭代器,不能直接是数字
	v.insert(v.begin()+3, 6);
	for (int i = 0; i < v.size(); i ++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	
	v.erase(v.begin()+2, v.begin()+4);
	//这个删除区间是[v.begin()+2, v.begin()+4)
	for (int i = 0; i < v.size(); i ++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	
	return 0;
}

代码结果

(6)访问向量

I. 直接采用下标
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	ios::sync_with_stdio(0);
	
	vector<int> v;
	for (int i = 1; i <= 3; i ++)
	{
		v.push_back(i);
	}
	for (int i = 0; i < v.size(); i ++)  //注意从0开始
	{
		cout << v[i] << " "; //与数组的访问方法相同
	}
	cout << endl;
	
	return 0;
}
II.使用迭代器访问
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	ios::sync_with_stdio(0);
	
	vector<int> v;
	for (int i = 1; i <= 3; i ++)
	{
		v.push_back(i);
	}
	for (vector<int>::iterator it = v.begin(); it != v.end(); it ++)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	return 0;
}

3. 例题

题目
下面是AC代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	ios::sync_with_stdio(0);  //输入输出优化
	
	vector<int> v;  //原数组
	vector<int> ji; //所有的奇数
	
	int n;
	cin >> n;
	for (int i = 1; i <= n; i ++)
	{
		int x;
		cin >> x;
		v.push_back(x);
	}
	
	for (vector<int>::iterator it = v.begin(); it != v.end(); it ++)
	{
		if (*it % 2 == 1) ji.push_back(*it);  //将奇数放入向量中
	}
	
	sort(ji.begin(), ji.end()); //对向量进行排序,相当于sort(a,a+n)
	
	for (vector<int>::iterator it = ji.begin(); it != ji.end(); it++)
	{
		if (it != ji.end()-1)  //不是最后一个元素
		{
			cout << *it << ",";
		}
		else //是最后一个数据
		{
			cout << *it;
		}
	}
	
	return 0;
}

二、结构体

结构体适用于记录一个整体的数据,并在排序时整体移动。

1.基本写法

定义:

struct node{
	...
};  //注意不要漏分号

声明:

node a[N];

我们去实例中来解释。

2.实例

精挑细选题目
很简单,只需要定义一个结构体,并按照规则进行排序即可。最后一条有确定编码互不相同,所以不存在无法比较出的情况。

#include <iostream>
#include <algorithm>
using namespace std;

struct gang{
	int length, zhi; //钢管长度、直径
	long long id;  //钢管编号(开了long long,害怕int存不下)
}a[1005];

bool cmp(gang x, gang y) //sort比较方法
{
	if (x.length != y.length) return x.length > y.length; 
	//长度优先比较
	else
	{
		if (x.zhi != y.zhi) return x.zhi < y.zhi;//直径比较
		else return x.id > y.id; //编号比较
	}
}

int main()
{
	ios::sync_with_stdio(0);
	
	int n;
	cin >> n;
	for (int i = 1; i <= n; i ++)
	{
		cin >> a[i].length >> a[i].zhi >> a[i].id;
	}
	sort(a+1, a+n+1, cmp); //排序
	cout << a[1].id << endl;
	
	return 0; 
}

挺简单的,是不是?(・∀・(・∀・(・∀・…

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值