当前位置:   article > 正文

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

vector结构体

一、vector

1.简单介绍

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

2.使用

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

#include <vector>
  • 1

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)是等价的
  • 1
  • 2
  • 3

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

(2)push_back()

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

(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

运行结果

(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

代码结果

(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

二、结构体

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

1.基本写法

定义:

struct node{
	...
};  //注意不要漏分号
  • 1
  • 2
  • 3

声明:

node a[N];
  • 1

我们去实例中来解释。

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/243911
推荐阅读
相关标签
  

闽ICP备14008679号