字符串
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
//可以简写成:
char greeting2[] = "Hello";
遍历字符串 : 字符串实际上背后还是一个数组,所以可以使用数组遍历的手法来获取每一个字符 。
char name[] = "hello";
for (int i = 0; i < sizeof(name ) / sizeof(char); ++i) {
std::cout << name[i] << std::endl;
}
字符串操作
//拷贝字符串
char name[] = "hello";
char name2[6];
//参数一: 目标字符串, 参数二:源字符串
strcpy(name2 , name);
std::cout << name2 << std::endl;
//拼接字符串
strcat(name2 , " , 张三");
std::cout << name2 << std::endl;
// 返回字符串长度
int len = strlen(name2);
std::cout << "name2的长度:" << len << std::endl;
Vector
Vector其实很大程度上和数组一样,只是数组是固定长度,而vector是不定长度(动态增长)。 假设我们需要记录明年的测试成绩,但是我们并不知道明年会有多少个学生。那么可以有两种选择,定义一个固定长度的数组,这个长度超过假设的长度, 另一种办法就是使用动态数组,比如是: vector
vector 在C++STL(标准模板库)中的一个容器,可以看成是对容器的一种扩展。在运行时可以改变长度 , 与数组具有相似的语法 , 相比数组更高效 , 提供越界检查
- 声明
#include <vecotr>
using namespace std;
int main(){
vector <char> vowels;
vector <int> test_score;
// =========================
vector <char> vowels(5); //声明一个初始大小为5的char类型vector
vector <int> test_score(10);
return 0;
}
- 初始化
#include <vecotr>
using namespace std;
int mian(){
//数组定义
int test_score []{100,99,18,81}
//vector定义
vector <char> vowels {'a' , 'e' , 'i' , 'o' ,'u'};
vector <int> test_score{ 100 ,98,95,90,80};
vector <double> temperatures{26,20.7};
return 0;
}
- 操作vector
vector<int> test_score {100,90,85};
test_score.at(0) = 73; // 修改
//追加
test_score.push_back(80); // 100 , 90 , 85 , 80
test_score.push_back(95); // 100 , 90 , 85 , 80 , 95
//使用下标遍历
vector<int> scores{ 100 ,95 ,88 ,80 ,75};
for (int i = 0; i < scores.size(); ++i) {
cout << scores[i] << endl;
}
//基于范围for遍历
vector<int> scores{ 100 ,95 ,88 ,80 ,75};
for(int score : scores){
cout << score << endl;
}
- 越界检查
// 只要当我们使用了vector的语法去获取超出索引的元素时,就会抛出异常。而使用数组的语法去获取元素,则不会进行越界检查
- 二维vector : 二维vector和二维数组实际上差不太多,二维数组是数组里面装的是数组,二维vector指的是vector里面装的还是vector,在未来碰到矩阵相关的存储操作,多半使用vector来作为媒介。
//例:
#include <iostream>
#include <vecotr>
using namespace std;
int main(){
//声明并初始化vector
vector<vector<int>> scores {
{95,77,80,85},
{58,89,93,100},
{69,73,81,97}
};
for (int i = 0; i < scores.size(); ++i) {
for (int j = 0; j < scores[i].size(); ++j) {
cout << scores[i][j] <<"\t" ;
}
cout << endl;
}
return 0 ;
}
- Vector总结
// vector是一个动态增长的数组, 随着我们添加内容,会逐步的增加空间。实际上它并不是在原来的地方,追加空间。而是开辟新的空间,然后把数据拷贝都新的空间里面去,接着让容器指向这块新的空间。
函数
函数的四种写法
/*
无参无返回值
无参有返回值
有参无返回值
有参有返回值
*/
// int a 和 int b 为参数
// return 后面为返回值
int add(int a , int b){
return a + b;
}
函数的定义
- 先定义后使用
#include <iostream>
using namespace std;
//函数定义 ,函数的真正实现。
int add(int a , int b){
return a + b ;
}
int main(){
cout << add(1 ,2)<< endl;
return 0 ;
}
- 先申明后使用 :把函数分成声明和定义两部分,函数的原型定义在调用的前面,具体实现可以放在后面。
#include <iostream>
using namespace std;
//函数声明 ,也叫函数原型 并不知道这个函数具体是如何实现的。只是有一些基本架子而已。
int add (int a , int b);
int main(){
cout << add(1 ,2)<< endl;
return 0 ;
}
//函数定义 ,函数的真正实现。
int add(int a , int b){
return a + b ;
}
- 分离式编译
1. 头文件(.h文件)里面主要是用于声明(变量 、函数、类)
2. 函数或者类的具体实现,就应该放在源文件(cpp文件)当中
3. 头文件里面的三句话不能省略,可以防止重复包含头文件
4. 只需要在源文件中include就OK 。
- 函数是如何被调用工作的
1. 函数是使用函数调用栈来管理函数调用工作的。
1. 类似盒子的栈
2. 遵循后进先出
3. 可以往里面执行压栈和出栈动作(push 和 pop)
2. 栈的结构和激活记录
1. 函数必须把它的返回值返回给调用它的函数(A ---> B)
2. 每次函数的调用都需要创建一次激活记录,然后把它压入栈中(push)
3. 当一个函数被调用完毕的时候,就需要从栈中弹出(pop)
4. 函数的参数以及内部的局部变量都是存储在栈中。
3. 函数栈有可能抛出栈溢出异常(Stack Overflow)
1. 一旦函数调用栈中被push进来的函数记录过多,就有可能出现。(例如:无限循环调用 | 递归 )
- 范围规则
// 单独代码块
#include<iostream>
using namespace std;
int main(){
int num{10};
int num1{20};
cout << num << num1 << endl;
{
int num{100};
cout << "num = "<< num << endl;
cout << "num1 = "<< num1 << endl;
}
}
// 函数中局部变量
#include<iostream>
using namespace std;
int num{300};
void local_example(int x){
int num{1000};
cout << "num =" << num << endl;
num = x ;
cout << "num =" << num << endl;
}
/*静态本地变量
1. 只会初始化一次
2. 重复调用函数也只会初始化一次。*/
#include<iostream>
using namespace std;
void static_local_example(){
static int num{100};
cout << "num ="<< num << endl;
num+=100;
cout << "num ="<< num << endl;
}
int main(){
static_local_example();
static_local_example();
return 0 ;
}
/*全局变量 :
通常声明在所有函数和类的外部 ,若存在局部变量和全局变量同名情况下,可以使用 域操作符 `::` 来访问全局变量*/
#include<iostream>
using namespace std;
int age = 99;
int main(){
int age =18 ;
cout << ::age << endl;
return 0 ;
}