C/C++vector

一、数组的限制

  • 数组在定义时,就要指定大小(常量)
int arr1[100];
int n = 100;
int arr2[n];//这种写法不合适
  • 函数内部定义的数组不能太长
    因为内存会划分一部分空间称之为栈,用来存局部变量,它很小

二、vector【动态数组】c++风格的容器

在内存中是顺序存储,线性表

#include<vector>
using namespace std;
int arr[10]——>vector<int> vec;

操作

初始化

vector<int> vec1;
//尾部扩容
vec1.push_back(1);
vec1.push_back(3);

vector<int>vec2 {1,2,3};
vector<int> vec3(10000);//[0]~[9999]都是0

访问 修改 调整 vector

//push_back 扩容 效率最高
//pop_back 弹出最后一个元素
vec2.pop_back();

vec2[i] //i从0开始,不要越界
for(unsigned i=0;i<vec2.size();++i){
vec2[i]++;
}
//迭代器 ——>指针
//vec2.begin()指向第一个;vec2.end()尾后,指向最后一个后面的那个
for(vector<int>::iterator it=vec2.begin();it!=vec2.end();++it){
printf("%d\n",*it);
}

随机位置的插入和删除

//insert
vector<int>::iterator it1=vec2.begin()+1;
vec2.insert(it1,4);//插入这个指针之前
//erase
vec2.erase(it1);

三、题目

描述
一个数如果恰好等于它的各个因子(该数本身除外)之和,如6=3+2+1,那么称数为“完数”;若因子之和大于该数,则称其为“盈数”。求出2到60之间的所有“完数“和”盈数”。
输入
题目没有任何输入
输出
输出2到60之间的所有“完数”和“盈数”,并以下形式输出
E:a1 a2 a3 …(ai为完数)
G:b1 b2 b3 …(bi为盈数)

#include<cstdio>
#include<vector>
using namespace std;
int sum(int i) {
	int sum = 0;
	for (int j = 1; j < i; j++) {
		if (i % j == 0) {
			sum += j;
		}
	}
	return sum;
}
int main() {
	vector<int>Evec;//完数
	vector<int>Gvec;//盈数
	for (int i = 2; i <= 60; i++) {
		if (sum(i) == i) {
			Evec.push_back(i);
		}
		if (sum(i) > i) {
			Gvec.push_back(i);
		}
	}
	printf("E:");
	for (unsigned i = 0; i < Evec.size(); i++) {
		printf(" %d", Evec[i]);
	}
    printf("\n");
	printf("G:");
	for (unsigned i = 0; i < Gvec.size(); i++) {
		printf(" %d", Gvec[i]);
	}
	printf("\n");
}

四、vector的实现原理

存放在栈区
包含的东西

  • size 容量
  • capacity 内存大小
  • ptr 地址 【指向堆区】

vector的扩容机制
size逐渐增大达到capacity

  1. 申请内存 2capacity
  2. 已经加入的元素拷贝到新开辟的空间
  3. 释放原内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值