The C++ Programming Language 第八章 笔记

PCIe ATS介绍 主机侧使用IOMMU完成设备地址到物理memory地址的转换,以及设备访问权限的检查。但如果所有PCIe设备都在进行DMA操作,则TA(Translation Agent)和ATPT(Address Translation and Protection Table)则会成为瓶颈,从而影响系统的latency。 阅读详情

The C++ Programming Language 第八章 笔记
名字空间和异常
james chen
050320

8.1 模块化和界面 暂略过

*********************
8.2 名字空间
*********************

名字空间是一种描述逻辑分组的机制。也就是说,如果一些声明按照某种准则在逻辑上属同一类,则可以将他们放入同一个名字空间,以表明这个事实。如菜单之edit:
namespace Edit
{
void copy(char){}
void cut(char){}
void paste(char){}
void delete(char){}
}
namespace File
{
void open();
void save();
void exit();
}
对于名字空间内成员的定义,一般来说应放在名字空间外与其声明分开:
namespace Edit
{
void copy(char);
void cut(char);
void paste(char);
void delete(char);
}
void Edit::copy(char x){}
void Edit::cut(char x){}
void Edit::paste(char x){}
void Edit::delete(char x){}
将声明与定义分离后,用户看到的只是声明,而函数体将被放在什么地方,用户则无需太多关心。
请注意,每个函数只能一个声明和定义。

名字空间成员必须在空间内声明,不能在名字空间外引入新成员:
void Edit::search(char);  //错,必须在namespace里声明。

名字空间成员函数的定义与其声明必须遵循函数准则:
void Edit::cpoy(char x){}  //错,Edit中没有cpoy()
void Edit::cut(int a){}   //错,要求形参为char

一个namespace也就是一个作用域。常规的局部作用域、全局作用域和类也是namespace。
理想的情况是,程序里的每个实体都属于某个可以识别的逻辑单位,所以,一个好程序里的每个声明都应该位于某个名字空间里,以此指明它在程序中所扮演的角色。


8.2.1 带限定词的名字
因为名字空间是作用域,所以普通的作用域规则也对名字空间成立。因此,如果一个名字先前已在本名字空间里或者其外围作用域里声明过,它就可以直接使用了,不必再进一步为它操心,也可以使用来自另一个名字空间的名字,但需要用该名字所属的名字空间作为限定词。如:
void Edit::copy(char x)
{
cut(x);     //不需要限定词,因为cut和copy同处于Edit名字空间
File::open();    //open是File中的,所以要限定词
}


8.2.2 使用声明
当某个名字在它自己的名字空间之外频繁使用时,每次使用都得加上限定词,这样做的确很讨厌,如
void Edit::copy(char x)
{
cut(x);
File::open();
File::open();
File::open();
File::open();
.....
}

反复的书写限定词很让人讨厌,这些多余的东西可以通过一个“使用声明”而清除掉,如:
void Edit::copy(char x)
{
using File::open;   //使用来自File的open成员
cut(x);
open();
open();
open();
open();
}

如果a namespace使用了b namespace中的成员,我们可以把有关的使用声明放在a的定义里,如:
namespace Edit
{
void copy(char);
void cut(char);
void paste(char);
void delete(char);
using File::open;   //使用File中的open成员
}
void Edit::copy(char x)
{
cut(x);
open();
}
这样一来,我们可以完全把open当作Edit的内部成员使用,而无须关系它是不是来自其它成员。


8.2.3 使用指令
一个“使用指令”可以将一个namespace的所有名字变成可用的,在用户看来,几乎就和它本身的名字一样。如:
namespace Edit
{
void copy(char);
void cut(char);
void paste(char);
void delete(char);
using namespace File;   //使用来自File中的所有名字都可用
}
void Edit::copy(char x)
{
cut(x);
open();
exit();
}


8.2.4 多重界面

接口(界面)的作用就是尽可能减小程序不同部分之间的相互依赖。最小的接口将会使程序易于理解,有很好的数据隐蔽性质,容易修改,也编译得更快。
namespace Edit
{
void copy(char*);
void cut(char*);
}
namespace File
{
void open();
void save();
}
namespace EF_interface
{
using Edit::copy;
using Edit::cut;
using File::open;
using File::save;
}
我们在EF_interface中使用Edit/File成员,再将其开放给用户,用户通过EF_interface间接使用Edit/File成员。当然也可以在EF_interface中新增成员,在成员定义再使用Edit/File成员,如:
namespace EF_interface
{
void copy(char*);
void cut(char*);
void open();
void save();
}
void EF_interface::copy(char* a){Edit::copy(a);}
void EF_interface::cut(char* a){Edit::cut(a);}
void EF_interface::open(){File::open();}
void EF_interface::save(){File::save();}
间接使用接口的另一种方式。
晕,这一节不大明白。。。。

8.2.5 避免名字冲突

名字空间就是为了表示逻辑结构。最简单的这类结构就是分清楚由一个人写的代码与另一个人写的代码。
当我们从相互独立的部分组合起一个程序,在这些单独模块中若有相同名字时,就产生冲突,考虑:
//my.h
char f(char);
int f(int);
//your.h
char f(char);
int f(int);
有了这些定义以后,第三方就很难同时使用my.h和your.h。一个很明显的解决办法就是将每组声明包含在各自的名字空间中:
//my.h
namespace My{
char f(char);
int g(int);
}
//your.h
namespace Your{
char f(char);
int g(int);
}
现在就可以在第三方中通过使用声明、使用指令来使用my.h和your.h中的声明,如:
#include "my.h"
#include "your.h"
using My::f;
using Your::g;
void main()
{
char a=f('a');    //使用my.h中的f;
char b=Your::f('a');   //使用Your.h中的f
}
也可以把先using namespace My,要用Your空间成员时,再用限定词Your::来使用。。


8.2.5.1 无名名字空间
namespace
{
int a;
void f();
}
相当于:
namespace $$$
{
int a;
void f();
}


8.2.6 名字查找
一个取T类型参数的函数常常与T类型本身定义在同一个名字空间里。因此,如果在使用一个函数的环境中无法找到它,我们就去查看它的参数所在的名字空间,如:
namespace AA
{
class Date{};
bool operator==(const Date&,const std::string&);
std::string format(const Date&);
}
void f(AA::Date d,int i)
{
std:string s=format(d);   //OK,AA::format(d)
std:string t=format(i);   //错,在作用域里没有format(int)
}

与显式地使用限定比,这个查找规则能使程序员节省许多输入,而且又不会以“使用指令”那样的方式污染名字空间。这个规则对于运算符的运算对象和模板参数特别有用,因为在那里使用显式限定是非常麻烦的。
请注意,名字空间本身必须在作用域里,而函数也必须在它被寻找和使用之前声明。
一个函数形参可以来自多个名字空间,如:

void f(AA::Date d,std::string s)
{
if(d==s)
{...}
else if(d=="august 4,1914")
{...}
}
对于这种情况,我们将在调用的作用域里,在每个参数(包括每个参数的类和基类)的名字空间里查找函数,而后对找到的所有函数执行普通的重载解析规则。
对于上面的d==s,我们将在f()的作用域里,在名字空间std和AA中查找最区域d==s的运算符,在std中存在一个operatror==,但它不以Date和string为参数,而AA的operator==以Date,string为参数,所以就用AA::operator==。
当一个类的成员调用一个命名函数时,函数查找时应当偏向于同一个类及其基类的其他成员,而不是基于其他参数的类型可能发现的函数。

8.2.7 名字空间别名

如果用户给他们的名字空间取很短的名字,不同名字空间的名字也可能出现冲突:
namespace A{    //A太短,易引起冲突
class String{};
}   
A::String s1="asdfasf";
A::String s2="kjhlegd";

然而长名字在实际代码中用起来又不是很方便:
namespace Akfsdlflksldflksdflj{  //又太长,使用起来不方便
class String{};
} 
Akfsdlflksldflksdflj::String s3="asdfasf";
Akfsdlflksldflksdflj::String s4="kjhlegd";

这种两难境地通过为长名字取别名的方式来解决:
namespace ASA=Akfsdlflksldflksdflj; //替长名字取别名,嘿,有点引用的感觉
ASA::String s3="asdfasf";
ASA::String s4="kjhlegd";

名字空间别名也使用户能够引用“某一个库”,并通过惟一的一个声明来定义那个库到底是什么:
namespace Lib=Foundation_library_v2r11;
Lib::set s;
Lib::string s5="sdfsfsf";
使用Lib而不是Foundation_library_v2r11,这使得程序极大简化,且代码维护也变得简单,当需要更新到新版时,只要将别名处重新定义即可,而不需要到处修改。

当然,过多的使用别名也会引用混乱。

8.2.8 名字空间组合
我们常常需要从现存的界面出发组合出新的界面,如:
namespace His_string{
class String{/*....*/};
String operator+(const String&,const String&);
String operator+(const String&,const char*);
void fill(char);
//.....
}

namespace Her_vector{
template<class T>class Vector{/*...*/};
//....
}

namespace My_lib{
using namespace His_string;
using namespace Her_vector;
void my_fct(String&);
}

有了这些,我们就可以在My_lib的基础上写程序了:
void f()
{
My_lib::String s="Byosdf";  //这里使用的是My_lib::His_string::String
//...
}
using namespace My_lib;
void g(Vector<String>& vs)  //等同于void g(Vector<My_lib::His_string::String>& vs)
{
//...
my_fct(vs[5]);    //调用的是My_lib::my_fct(vs[5])
//...
}
如果显式限定的名字(如String)在所说的名字空间里没有声明,编译器就会去查看"使用指令"的名字空间(如His_string)。
按理想情况一个名字空间应该:
[1]描述了一个具有逻辑统一性的特征集合。
[2]不为用户提供对无关特征的访问。
[3]不给用户强加任何明显的记述负担。

8.2.8.1 选择
有时我们只是想从一个名字空间里选用几个名字,如:
namespace His_string{
class String{/*...*/};
String operator+(const String&,const String&);
String operator+(const String&,const char*);
}
但是,除非我是His_String的设计者或者维护者,否则这一做法很快就会陷入混乱。任何“真正的”Hit_String定义的修改都不会在这个声明中反映出来。通过“使用声明”来做,可以使从名字空间里选择一些特征的事变得更加明确:

namespace My_String{
using His_String::String;
using His_String::operator+;  //使用任何+
}

“使用声明”将具有所指定的名字的每个声明都带入作用域。特别地,通过一个“使用声明”就可以将一个重载函数的所有变形都带进来。
在这种方式下,如果His_String的维护者给String增加了一个成员函数,或者拼接了运算符增加了一个重载版本,这种修改将自变成My_String的用户可用的东西。相反,如果某些特征被删除,对My_String的影响也将被编译器检查出来。

8.2.8.2 组合与选择
将组合(使用指令)和选择(使用声明)结合起来可获得更多的灵活性。考虑:
namespace His_lib{
class String{/*...*/};
template<class T>class Vector{/*...*/};
//...
}
namespace Her_lib{
class String{/*...*/};
template<class T>class Vector{/*...*/};
//...
}
namespace My_lib{
using namespace His_lib;  //使用来自His_lib的所有东西
using namespace Her_lib;  //使用来自Her_lib的所有东西
using His_lib::String;   //使用来自His_lib的String
using Her_lib::Vector;   //使用来自Her_lib的Vector
template<class T>class List{/*...*/}; //新增
//...
}
在查看一个名字空间时,其中显式声明的名字(包括作用声明)优先于在其他作用域中的那些通过“使用指令”才能访问的名字。这样在,My_lib的用户将会看到,对于String和Vector名字冲突的解析分别偏向于His_lib::String和Her_Vector。List总是指My_lib::List,而不管在His_string和Her_Vector中是否存在List,因为重载。

一般来说,在将一个名字引进一个新的名字空间时,最好让其保持不变,这样的话我们就不用记住两个名字。当然,这也不是绝对的,有时候用新名字将更好:
namespace lib2{
using namespace His_lib;
using namespace Her_lib;
using His_lib::String;
using Her_lib::Vector;
typedef Her_lib::String Her_string; //重命名
//......
}

8.2.9 名字空间和老代码 过
8.2.9.1 名字空间和c 过

8.2.9.2 名字空间和重载
重载可以跨名字空间工作。对于我们能以最小的代价将现存的库修改为使用名字空间的东西而言,这特征是必不可少的:

//老的a.h
void f(int);
//老的b.h
void f(char);
//
老的user.c
#include "a.h"
#include "b.h"
void g()
{f('a');}    //调用b.h中的f()

将其升级到使用名字空间的版本,无须修改实际代码:
//新的a.h
namespace A{
void f(int);}
//新的b.h
namespace B{
void f(char);}
//
新的user.c
#include "a.h"
#include "b.h"
using namespace A;
using namespace B;
void g()
{f('a');}    //调用b.h中的f()

8.2.9.3 名字空间是开放的
名字空间是开放的,也就是说,你可以通过多个名字空间声明给它加入名字。例如:
namespace A{
int f();    //现在A有成员f()
}
namespace A{
int g();    //现在则有f()和g()
}
通过这种方式,我们就能支持一个名字空间中放入几个大的程序片段,其方式就像老的库和应用存在于同一个全局名字空间里那样。为做到这些,我们必须允许一个名字的定义分布到多个头文件和源代码里。
//my.h     //有两个函数,g()和f()
void f();
#include<stdio.h>
int g();
//....
重写:
//my.h     //haha namespace中有g(),f()
namespace Haha{
void f();
}
#include<stdio.h>
namespace Haha{
int g();
}
//....

在写新代码时,名字空间要尽量的小,而不是将代码的主要片段都塞进同一个名字空间。

在定义一个名字空间里已经声明过的成员时,更安全的方式是采用Haha::语法形式,而不是重新打开Haha。如:
void Haha::ff()    //错误,在Haha里没有void ff();
{}
编译器能捕捉到这个错误,然而,由于在一个空间里可以定义新函数,编译器就无法报错!!如:
namespace Haha{
void ff()    //哎,ff被作为新成员写入Haha
{/*.....*/}
}
编译器并不知道是写错了,我们的本意是定义void f(),现在函数没定义好,还画蛇添足。。

*********************
8.3 异常
*********************
当一个程序由一些相互分离的模块组成时,特别是当这些模块来自某些独立开发的库时,错误处理的工作就需要分成两个相互独立的部分:
[1]一方报告出那些无法在局部解决的错误。
[2]另一方处理那些在其他地方检查出的错误。


晕,看得稀里糊涂的,以后再来看吧。

8.4 忠告

[1]用名字空间表示逻辑结构。
[2]将每个非局部的名字放入某个名字空间里,除了main()之外。
[3]名字空间的设计应该让你能很方便地使用它,而又不会意外地访问了其他的无关空间。
[4]避免对名字空间使用很短的名字。
[5]如有需要,通过名字空间别名去缓和名字空间名的影响。
[6]避免给你的名字空间的用户添加太大的记法负担。
[7]在定义名字空间的成员时使用namespace::member的形式。
[8]只在转换时,或者在局部作用域里,才用using namespace。
[9]利用异常去松驰“错误”处理代码和正常处理代码之间的联系。
[10]采用用户定义类型作为异常,不用内部类型。
[11]当局部控制结构足以应付问题时,不要用异常。

移相变压器Simulink建模与HVDC系统仿真实践 移相变压器是电力电子领域实现精确相位调节的核心设备,其通过特殊绕组设计改变输出电压相位角,在解决环网潮流不均、阻尼功率振荡等场景具有关键作用。本文基于MATLAB/Simulink环境,详细解析移相变压器的建模原理与技术实现,包括磁路耦合特性模拟、参数计算方法和控制策略设计。针对HVDC高压直流输电和FACTS柔性交流输电系统等典型应用,提供仿真模型搭建技巧与问题排查指南,特别涵盖新能源并网场景下的相位调节优化方案。通过实测数据验证,所建模型在稳态精度和动态响应方面均满足工程要求,为电力系统稳定性分析提供有 阅读详情

相关推荐

Anaconda详细安装及使用教程(带图文)

Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约531 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和Python)。 Conda是一个开源的包、环境管理器,可以用于...

代码帮 186万+

关于 The c++ programming language 其中的一条忠告

10.4.10 临时对象 临时对象最经常是作为算术表达式的结果出现的。例如,在求值想×*y+z过程中的某一点,部分结果x*y必须存在于某个地方。除了与性能有关的问题之外,临时对象很少成为程序员关心的问题。但这种情况确实也有可能出现。 除非一个临时对象被约束在某一个引用,或者被用于做命名对象的初始化,否则它将总在建立它的那个完整表达式结束时销毁。所谓完整表达式就是那种不是其他表达...

遥望盼望,能像清风陪伴她飘去 2706

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1190

C++之父Bjarne Stroustrup对C++使用者的忠告

C++之父Bjarne Stroustrup 写的The C++ Programming Language (Special Edition)中各章后 面的忠告。 第1 章致读者 [1] 在编写程序时,你是在为你针对某个问题的解决方案中的思想建立起一种具体表示。让程序的结构尽可能地直接反映这些思想。 [a] 如果你能把“它”看成一个独立的概念,就把它做成一个...

weixin_34375251的博客 241

PyCharm启动报错急救指南:3步定位.vmoptions文件位置(Win/Mac路径详解)

本文针对PyCharm启动失败问题,提供了一份详细的急救指南。核心在于精准定位并修复关键的.vmoptions配置文件。文章通过三步法详解了在Windows和macOS系统上查找该文件的具体路径,并分析了因新旧版本冲突、破解补丁残留或参数设置错误导致启动失败的常见场景及解决办法,帮助开发者快速恢复IDE的正常工作。

weixin_28835789的博客 702

嘉立创EDA vs Altium Designer:新手如何选择?从界面到实战全对比

本文全面对比了嘉立创EDA与Altium Designer(AD)两大PCB设计工具,从设计哲学、界面交互、封装库管理、设计规则引擎、协作功能到成本生态六大维度进行深入分析。嘉立创EDA以极简设计和云端协作为特色,适合学生和创客快速上手;而AD则凭借专业级精准控制,成为高端电子设计的行业标准。通过实战案例和详细对比表格,帮助新手根据项目需求选择合适的EDA工具。

weixin_30296405的博客 721

《The C++ Programming Language》读书笔记

2.1 What is C++? tour n.旅行 paradigm n.典范 with a bias towards systems programming 偏向于系统编程 This chapter explains what this means without going into the finer detailsof the language definition.(?)

backard的专栏 747

RDMA学习笔记-IB五层网络协议和报文结构

Reference InfiniBand Architecture Specification Volume 1, Release 1.3 文章目录IBA 网络协议分层1.链路层1.1 LRH1.2 ICRC1.3 VCRC2.网络层(GRH)3.传输层3.1 BTH3.2 extended transport header4. 报文结构4.1 send request4.2 RDMA Write request4.3 RDMA Read request4.4 ACK4.5 Atomic operatio

u014114310的博客 9470

C++程序设计--第八章:名字空间和异常

1、模块化和界面 理想情况下,模块和界面分开,并且一个模块的大部分细节都不为它的使用者所知。 2、名字空间 名字空间是一种描述逻辑分组的机制。 3、异常 异常机制是C++中用于将错误报告和错误处理分开的手段。

baiyangdfish的专栏 396

自适应控制 (Adaptive Control) 算法详解及案例分析

自适应控制是一种能够在线调整控制器参数以适应系统动态变化的控制方法。其核心思想是通过实时估计系统参数或调整控制器参数,使系统在不确定性或动态变化的环境中仍能保持稳定性和性能。

闲人编程的博客 4085

【AUTOSAR-E2E】-2.2-配置E2E:基于E2EPW配置一个TX发送的Signal Group(使用E2E Profile 2)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> &lt.

「汽车电子助手」的博客 4219

《C程序设计语言》(《The C Programming Language》)第二版第八章练习题

8-1: 用read、write、open和close系统调用替代标准库中功能等价的函数,重写第七章的cat程序,并通过实验比较两个版本的相对执行速度 #include <stdio.h> #include <fcntl.h> #define BUFSIZE 1000 int main(int argc, char **argv) { int fp; void fi...

m0_46655998的博客 556

【Unity 实用工具篇】 | Book Page Curl 快速实现翻书效果

游戏和应用开发中,真实感的交互设计能显著提升用户体验。Unity3D图书翻页效果插件为开发者提供了一种便捷方式,可在项目中实现高度拟真的书籍翻页动画。 本文介绍该插件的快速使用方法,涵盖从基础导入到自动翻页效果创建的全过程,让我们快速实现翻页效果。

努力前行,总会成为自己心中的那道光 1万+

《The C Programming language》读书笔记5

尽量利用能利用的资源    在上篇文字中,我们设计了一个非常简单的list,在设计的过程运用了在本书第五、六章的知识,这些东西是c语言中最难的部分,学术方面的讨论随处可见,指针的用法和特性多得让人无法记住,个人认为最好的方法是多实践,在实践遇到的问题往往就是最常见的、最重要的知识点,至于那些特别的特性,等熟悉了那些常见的后也就不难理解他们了。   本书的第七。八两章所述的内容严格来说是不属

学习与研究 3175

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

用VS Code高效调试K&R《C程序设计语言(第2版)》习题解答:C/C++扩展配置与launch.json实战

K&R《C程序设计语言(第2版)》是全球无数C语言学习者的经典入门教材,而跟着书中的习题逐题敲代码、**调试**运行,是真正掌握C语言指针、结构体与位运算的关键。但很多新手卡在了第一步:代码写好了,怎么用 **VS Code** 快速编译并**调试C语言程序**?别担心,本文将带你从零配置 **C/C++扩展** 与 **launch.json**,把 VS Code 变成专属于你的 C 语言调试

gitblog_00354的博客 1127

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

编程书籍:适合学习C语言的 7 本书籍,零基础别再乱买了

相信有很多同学想要高考后准备大学选择计算机方向,而90%以上的高校都是从C语言开始的,那么今天我就分享一下学习C语言的书籍,从基础到深入,这几本书完全够你学习了!

致力于C语言C++知识分享! 8779

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

学语言推荐C(转)

作为宅男电脑师,对于计算机系统以及程序运行有了足够的了解之后就可以开始学习程序设计语言了。一般来说我认为程序员分3类,玩语言的,玩构架的,玩思想的。语言是最基础的存在,当然也是最低阶的存在。当然我不是认为语言无用,只是到了一定的阶段之后,程序员必须有一个质的提升,成天说语言层上七七八八的东西就如同在简历里面写会Office处理文字一样幼稚,因为现在的程序设计语言都是图灵完备的(这句话过于偏激,应为...

weixin_34162401的博客 100

Python机器学习:从零基础到项目实战

当您翻开此书,您正踏入一场数据与智慧的修行。机器学习,并非冰冷的符码,而是机器模拟人类洞察世界的法门。本书将带您,以Python为舟,泛游于算法之海。我们不只传授“术”,更探求其后的“道”——从数据的生灭流转中观照规律,于模型的迭代演进里体悟得失。愿您合上书卷时,收获的不仅是驾驭数据的技能,更有一双洞悉复杂、化繁为简的“智慧之眼”。现在,让我们一同启程。

YunWisdom 969

Python深度学习:从入门到实战

亲爱的读者,欢迎您翻开这本书。我们即将探索的,是深度学习的宇宙——一个由数据、算法与算力构筑的奇妙世界。它既是严谨的科学,也是创造的艺术,更是一条通往未来智慧的修行之路。本书将带您从最基础的数学原理出发,亲手搭建神经网络,驾驭Transformer等前沿模型,最终将智慧转化为现实世界的价值。请放下畏惧,保持好奇。这不仅是一次知识的学习,更是一场思维的远行。来,随我一起,开启这趟非凡的旅程吧。

weixin_45747731的博客 296

The C++ Programming Language 第七章 作业

The C++ Programming Language 第七章 作业james chen0503177.10.1写出下面声明:一个函数,它以指向字符的指针和对整数的引用为参数,不返回值;一个指向这个函数的指针;一个以这种指针为参数的函数;以及一个返回这种指针的函数。写出一个函数的定义,它以一个这样的指针作为参数,并返回其参数作为返回值。void f(char*,int&);void (*g)(c

xchenbb的专栏 2725

The C++ Programming Language 第五章

The C++ Programming Language 第五章 学习笔记james chen/050220*********************5.1指针*********************对于类型T,T*就是"到T的指针",也就是说,一个类型为T*的变量能保存一个类型为T的对象的地址。char c=a;char *p=&c;                          

xchenbb的专栏 2149

The C++ Programming Language 第五章 作业

//The C++ programming language 作业 5.9.1//写出声明:到字符的指针,包含10个整数的数组,包含10个整数数组的引//用,到字符串数组的指针,到字符的指针的指针,常量整数,常量整数的//指针,到整数的常量指针。#includevoid main(){ char* a="i love bb!!"; cout int b[10]={1,2,3,4,5,6,7,8,9

xchenbb的专栏 2105
上一篇: The C++ Programming Language 第七章 作业
下一篇: 2021-03-31
xchenbb
博客等级 码龄22年 20粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xchenbb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值