一、数组的限制
- 数组在定义时,就要指定大小(常量)
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
- 申请内存 2capacity
- 已经加入的元素拷贝到新开辟的空间
- 释放原内存