1.Vector
vector是一个动态增长的数组,它会随着我们添加的内容,会逐步的增加空间。实际上它并不是在原来的地方追加空间,而是开辟新的空间,然后把原来的数据都拷贝到新的空间里面去,接着让容器指向这块新的空间。
vector声明和初始化
#include <vecotr> using namespace std; int main(){ vector <char> vowels; // 声明 vector<int>里面代表了 这个容器装的元素是int类型 vector <int> test_score; vector <char> vowels(5); //声明一个初始大小为5的char类型vector vector <int> test_score(10); //数组定义 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
通过[] 和 at()取vector的元素
- 数组的语法
#include <iostream> #include <vector> using namespace std; int main(){ vector<int> test_score {100,90,85}; cout << "第一个成绩是: " <<test_score[0] << endl; cout << "第二个成绩是: " <<test_score[1] << endl; cout << "第三个成绩是: " <<test_score[2] << endl; cout << "第三个成绩是: " <<test_score[3] << endl; //不会检查越界 return 0 ; }
- vector语法
#include <iostream> #include <vector> using namespace std; int main(){ vector<int> test_score {100,90,85}; cout << "第一个成绩是: " <<test_score.at(0) << endl; cout << "第二个成绩是: " <<test_score.at(1) << endl; cout << "第三个成绩是: " <<test_score.at(2) << endl; cout << "第三个成绩是: " <<test_score.at(3) << endl; //抛出越界异常 return 0 ; }
操作vector
- 修改vector元素
#include <vector> using namespace std; int main(){ vector<int> test_score {100,90,85}; test_score.at(0) = 73; return 0 ; }
- 往vector追加元素
#include <vector> using namespace std; int main(){ vector<int> test_score {100,90,85}; test_score.push_back(80); // 100 , 90 , 85 , 80 test_score.push_back(95); // 100 , 90 , 85 , 80 , 95 return 0 ; }
- 越界检查
只要当我们使用了vector的语法at()去获取超出索引的元素时,就会抛出异常。而使用数组的语法[]去获取元素,则不会进行越界检查
- 遍历vector
#include <iostream> #include <vector> using namespace std; int main(){ //使用下标遍历 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; } return 0 ; }
二维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) { // 获取二维vector里面的一维vector for (int j = 0; j < scores[i].size(); ++j) { // 获取一维vector里面的元素 cout << scores[i][j] <<" " ; } cout << endl; } return 0 ; }
2.函数
函数介绍
-
python的函数是以回车换行结尾,c++的函数是以 大括号结尾
-
python的函数通常使用缩进方式来表示函数体, ,c++使用大括号区域来表示
-
# 定义函数 def add(a, b): return a + b # 调用函数并接收它的返回值 sum = add(1,2) # 打印结果 print(sum)
C++ 函数
#include<iostream> using namespace std; // 声明并初始化函数 函数名前面的int代表这个函数的返回值为int类型 // 参数里面的int 指定这个参数传入的必须是int类型 int add(int a, int b){ return a + b ; } int main(){ // 调用add函数并打印结果 cout << add(1,2) << endl; return 0 ; }
定义函数
函数返回的类型 函数名(函数参数的类型 函数参数){
函数体
}
函数分为四种方式
- 无参数无返回值
- 无参数有返回值
- 有参数无返回值
- 有参数有返回值
1.无参数无返回值
无返回值的函数必须用void声明
#include <iostream> using namespace std; void say_hello(){ count << "hello" << endl; } int main(){ say_hello(); return 0 ; }
2.无参数有返回值
#include<iostream> using namespace std; string say_hello(){ return "hello"; } int main(){ cout << say_hello() << endl; return 0 ; }
3.有参数无返回值
#include<iostream> using namespace std; void say_hello(string name){ count << "你好 "<< name << endl; } int main(){ say_hello("张三"); return 0 ; }
4.有参数有返回值
#include<iostream> using namespace std; string say_hello(string name){ return "你好 "+ name; } int main(){ cout << say_hello("张三") << endl; return 0 ; }
函数原型
一般来说,c++的函数一般包含声明和定义两个部分。因为c++是静态类型语言,程序属于自上而下编译,所以在使用函数前,必须先表示函数的存在,告诉编译器函数所需要的参数以及函数的返回值是什么。把函数分成声明和定义两部分,函数的原型定义在调用的前面,具体实现可以放在后面。
#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 ; }
int add(int a , int b){ return a + b ; } int add(int a , int b , int c){ return a + b + c; } int add(double a , double b){ return a + b ; } int main(){ // 会自动根据参数的不同,进行匹配函数 add(3, 3); // 6 add(3, 3, 3); // 9 add(2.5 , 2.5); // 5 return 0 ; }
函数参数
python中传递不可变对象,在C++中,对应的是值的拷贝,也就是传递的只是数据的一份拷贝而已。在函数内部修改数据,并不会改变外部数据
#include<iostream> using namespace std; void scale_number(int num); int main(){ int number{1000}; scale_number(number); //打印number 1000 cout << number <endl; return 0 ; } void scale_number(int num){ if(num > 100) num = 100; }
-
前面提过,形参实际上就是实参的一份拷贝,就是一个局部变量。
-
数组的数据太大,如果都进行拷贝,那么比较麻烦,也造成了浪费
-
所以实际上传递数组的时候,并不会进行整个数组的拷贝,而只是传递数组的第一个元素内存地址 (指针 ) 进来。
-
数组的数据还是在内存中,只是把第一个元素(也就是数组的起始)内存地址传进来而已。
-
#include<iostream> using namespace std; using namespace std; //传递数组长度 void print_array(int number[] , 5); int main(){ //声明数组 int array []{1,2,3,4,5}; //打印数组 print_array(array , 5); return 0 ; } //传递数组,打印数组 void print_array(int array[] , int size){ for (int i {0} ; i < size ; i++){ count << array[i] << endl; } }
传递引用
引用实际上只是原有数据的一种别名称呼而已,使用 &
#include<iostream> using namespace std; void scale_number(int &num); int main(){ int number{1000}; scale_number(number); //打印number100 count << number <endl; return 0 ; } void scale_number(int &num){ if(num > 100) num = 100; }
内联函数
函数可以使我们复用代码,但是一个函数的执行,需要开辟空间、形参和实参进行值得拷贝,还要指明函数返回、以及最后回收释放资源的动作,这个过程是要消耗时间的。
#include<iostream> inline int calc_Max (int a, int b) { if(a >b) return a; return b; } int main(){ int max = calc_Max(3, 8); std::cout << "max = " << max << std::endl; return 0 ; }
#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; }
静态本地变量
在函数定义的变量前面加static关键字
#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 ; }
-----------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------------------------------------------------