动态数组
//sizeof是一个关键字
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *A;
int cntA;
int maxA;
int i;
A = NULL;
cntA=maxA=0;
int runTime = 1000;
if(A == NULL){ // 如果没有开辟成功
printf("Out of Space!!!");
return -1;
}
while(runTime--){
if(cntA >= maxA)
{
maxA = maxA * 2 +32; //因为maxA开始为 0 所以单纯*2没有用 要加32
//void* realloc (void* ptr, size_t size);
A = (int *)realloc(A , sizeof(int)*maxA);
}
A[cntA++] = rand()%100 + 1; //随机数在 1 - 100
}
for(i=0; i<cntA; i++){
printf("%d ",A[i]);
if((i+1)%10 == 0)
printf("\n");
}
printf("maxA = %d",maxA);
return 0;
}
//std::vector 实际内存大于已经存储的内存,和上面的动态开辟内存一样
//segmentation fault 段错误
//动态分配新内存 保存原来的数据
//int *A=NULL;//数组地址
//int maxA = 0;//最大内存
//int numA = 0;//已有存储数据量
//exit(1) 强制退出
//memcpy();
输出结果
maxA = 2016
这个动态数组一共开辟了2016个 sizeof(int),减少了开辟的次数。在翁恺的C语言进阶中讲过,动态数组的每一次开辟,都会先将原来的数组复制到更大的空间中(memcpy()),然后再进行添加操作。多次的开辟会让效率很低。解决多次开辟的一个方法是链表,或者就是如上的一次先开辟多个空间,尽量符合用量。
栈,队列,链表
#include<stack>
#include<iostream>
using namespace std;
int main()
{
stack<int > st;
st.push(1);
printf("%d",st.top());
st.pop();
return 0;
}
//用vector同样可以实现stack的效果
//std::list
使用STL的Stack,不可以对栈内进行打印。如果需要打印,可以使用Vector进行打印,或者在不复杂的情况下,C语言的情况下自己写一个结构Stack去进行打印。