support bazel complie this project and format code.

This commit is contained in:
zhangxing
2023-03-30 00:15:11 +08:00
committed by light-city
parent 1f86192576
commit 7529ae3a55
636 changed files with 10025 additions and 9387 deletions

View File

@@ -0,0 +1,23 @@
# please run `bazel run //practical_exercises/10_day_practice/day8/func:main`
# please run `bazel run //practical_exercises/10_day_practice/day8/func:max_spec`
# please run `bazel run //practical_exercises/10_day_practice/day8/func:max`
# please run `bazel run //practical_exercises/10_day_practice/day8/func:sort`
load("@rules_cc//cc:defs.bzl", "cc_binary")
cc_binary(
name = "main",
srcs = ["main.cpp"],
)
cc_binary(
name = "max_spec",
srcs = ["max_spec.cpp"],
)
cc_binary(
name = "max",
srcs = ["max.cpp"],
)
cc_binary(
name = "sort",
srcs = ["sort.cpp"],
)

View File

@@ -0,0 +1,38 @@
/* 重要.cpp */
// Eg9-1.cpp
#include <iostream>
//注意一点max与min使用的时候容易引起冲突如果写了下面这一行代码则要改变函数模板名字否则直接使用std::cout与std::endl
using namespace std;
/*
不要把这里的class与类的声明关键字class混淆在一起虽然它们由相同的字母组成但含义是不同的。
这里的class表示T是一个类型参数可以是任何数据类型如int、float、char等或者用户定义的struct、enum或class等自定义数据类型。
*/
template <class T> T Min(T a, T b) { return (a < b) ? a : b; }
/*
为了区别类与模板参数中的类型关键字class标准C++提出?了用typename作为模板参数的类型关键字同时也支持使用class。
比如把min定义的template <class T>写成下面的形式是完全等价的:
*/
template <typename T> T myMin(T a, T b) { return (a < b) ? a : b; }
/*
模板实例化发生在调用模板函数时。当编译器遇到程序中对函数模板的调用时,
它才会根据调用语句中实参的具体类型,确定模板参数的数据类型,
并用此类型替换函数模板中的模板参数,生成能够处理该类型的函数代码,即模板函数。
当多次发生类型相同的参数调用时只在第1次进行实例化。编译器只在第1次调用时生成模板函数
当之后遇到相同类型的参数调用时不再生成其他模板函数它将调用第1次实例化生成的模板函数。
*/
int main() {
double a = 2, b = 3.4;
float c = 2.3, d = 3.2;
cout << "23 的最小值是:" << Min<int>(2, 3) << endl; //显式调用
cout << "23.4 的最小值是:" << Min(a, b) << endl; //隐式调用
cout << "'a''b' 的最小值是:" << Min('a', 'b') << endl;
cout << "2.33.2的最小值是:" << Min(c, d) << endl;
cout << "2.33.2的最大值是:" << std::min(c, d)
<< endl; //引用命名空间内部的最小值函数
cout << "2.33.2的最小值是:" << myMin(c, d) << endl; //更换class为typename
// cout<<"2'a' 的最小值是:"<<Min(2,'a')<<endl;
// //报错,不同类型无法处理请看9-3-1.cpp
return 0;
}

View File

@@ -0,0 +1,18 @@
/* 求最大值.cpp */
// Eg9-2.cpp
#include <iostream>
using namespace std;
template <class T> T Max(T a, T b) { return (a > b) ? a : b; }
/*
C++在实例化函数模板的过程中,只是简单地将模板参数替换成调用实参的类型,并以此生成模板函数,不会进行参数类型的任何转换。
*/
int main() {
double a = 2, b = 3.4;
float c = 5.1, d = 3.2;
//在模板调用时进行参数类型的强制转换
cout << "2, 3.2 的最大值是:" << Max(double(2), 3.2) << endl;
cout << "a, c 的最大值是:" << Max(float(a), c) << endl;
//显示指定函数模板实例化的参数类型
cout << "'a', 3 的最大值是:" << Max<int>('a', 3) << endl;
}

View File

@@ -0,0 +1,30 @@
/* 模板特化.cpp */
// Eg9-6.cpp
#include <cstring>
#include <iostream>
using namespace std;
template <class T> T Max(T a, T b) { return (a > b) ? a : b; }
//特化
// template <> 返回类型 函数名<特化的数据类型>(参数表) {}
template <> const char *Max<const char *>(const char *a, const char *b) {
return (strcmp(a, b) >= 0) ? a : b;
}
template <> char *Max<char *>(char *a, char *b) {
return (strcmp(a, b) >= 0) ? a : b;
}
int main() {
float c = 5.1, d = 3.2;
char s1[] = "xyce", s2[] = "xbv";
cout << "2,3的最大值是" << Max(3, 2) << endl;
cout << "c,d的最大值是" << Max(c, d) << endl;
cout << Max("xbv", "xyce") << endl;
cout << Max(s1, s2) << endl;
}
/*
① 当程序中同时存在模板和它的特化时,特化将被优先调用;
在同一个程序中除了函数模板和它的特化外还可以有同名的普通函数。其区别在于C++会对普通函数的调用实参进行隐式的类型转换,
但不会对模板函数及特化函数的参数进行任何形式的类型转换。
*/

View File

@@ -0,0 +1,33 @@
/* 例1.cpp */
//函数模板参数可以是类属参数,也可以包括普通类型的参数
#include <iostream>
using namespace std;
template <class T>
//实现降序
void sort(T *a, int n) {
for (int i = 0; i < n; i++) {
int p = i;
for (int j = i; j < n; j++)
if (a[p] < a[j])
p = j;
T t = a[i];
a[i] = a[p];
a[p] = t;
}
}
template <class T> void display(T &a, int n) {
for (int i = 0; i < n; i++)
cout << a[i] << "\t" << endl;
}
int main(int argc, char const *argv[]) {
int a[] = {1, 41, 2, 5, 8, 21, 23};
char b[] = {'a', 'x', 'y', 'e', 'q', 'g', 'o', 'u'};
sort(a, 7);
sort(b, 8);
display(a, 7);
display(b, 8);
return 0;
}