数组和字符串
1. 数组
- 一系列元素
- 所有元素类型相同;
- 形成一个完整的集合。
在c++中,用数组按顺序将一系列相同类型的数据存储到内存中。
int nums[500]={0};
char chars[5];
1.1 静态数组
int nums1[5]={1,2,3,4,5};//分别初始化
int nums2[5]={0};//所有元素初始化为相同的值
int nums3[5]={1,2};//初始化部分元素,前两个
//数组长度定义为常量;
const int ArrayLength=5;
int nums4[ArrayLength]={0,1,2,3,4};
//知道数组每个元素的初始值,可以不指出数组大小;
int nums5[]={0,1,2,3,4};//将创建一个包含5个元素的数组。
在编译阶段,数组所包含的元素数以及占用的内存量都是固定的。数组长度是确定的,不能存储更多的数据;未使用的元素所占据的内存也不会减少。
1.2 动态数组
在不知道数组大小的情况下,若按照上限做出假设预留的大量内存会降低系统性能,我们使用动态数组来根据运行阶段需求增大数组。
std::vector
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> nums(2);
nums[0]=0;
nums[1]=1;
cout<<"the size of nums:"<<nums.size()<<endl;
nums.push_back(2);
cout<<"the size of nums:"<<nums.size()<<endl;
return 0;
}
输出:
the size of nums:2
the size of nums:3
请按任意键继续. . .
2. 字符串
在helloworld笔记一程序中,输出字符串cout<<"hello"<<endl
语句中的“hello”是一个字符串常量,将其写成字符数组的形式:
2.1 字符数组
#include<iostream>
using namespace std;
int main(){
char c1[]={'a','b','c','d','e'};
cout<<"c1="<<c1<<",and size is :"<<sizeof(c1)<<",and strlen is :"<<strlen(c1)<<endl;
c1[2]='\0';
cout<<"c1="<<c1<<",and size is :"<<sizeof(c1)<<",and strlen is :"<<strlen(c1)<<endl;
char c2[]={'a','b','c','d','e','\0'};
cout<<"c2="<<c2<<",and size is:"<<sizeof(c2)<<",and strlen is :"<<strlen(c2)<<endl;
c2[2]='\0';
cout<<"c2="<<c2<<",and size is:"<<sizeof(c2)<<",and strlen is :"<<strlen(c2)<<endl;
return 0;
}
输出:
c1=abcde烫烫烫搪鷲堸O,and size is :5,and strlen is :19
c1=ab,and size is :5,and strlen is :2
c2=abcde,and size is:6,and strlen is :5
c2=ab,and size is:6,and strlen is :2
请按任意键继续. . .
我们看到,c1
和c2
的差别在初始化时末尾是否加上了转义字符'\0'
,c1
没加,在打印时,出现了垃圾字符,这是因为cout
只有遇到空字符后才会停止打印,不管是否越界,这可能会导致程序崩溃。将c2
的第三位替换为空字符后,c2
打印输出看到字符串被截断,但数组长度不变;
在使用字符串字面量时,编译器会自动加上'\0'
在末尾;
2.2 字符串
C++标准字符串:std::string
C语言中常使用strcpy,strcat,strlen*(发现在笔试面试时这几个函数经常会考到,另开一篇专门整理一下这几个函数)*,这些函数会寻找终止空字符,如果没有在末尾添加空字符,这些函数会越界。
std::string是动态的,会在需要时增大其容量。
#include<string>