2022-11-15 13:50来源:m.sf1369.com作者:宇宇
sort函数进行快速排序,时间复杂度为n*log2n,比冒泡之类的要省时不少
Sort函数使用模板:
Sort(start,end,排序方法)
1.第一个参数是要排序数组的起始地址
2.第二个参数是数组结束地址的下一位
3.第三个是排序的方法,可不填,默认升序
一般是直接对数组进行排序,例如对数组a[10]排序,sort(a,a+10)就行了。
而sort函数的强大在与cmp函数的使用,即排序方法的使用
C++提供了函数模板(functiontemplate)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
1)C++提供两种模板机制:函数模板、类模板
2)类属—— 类型参数化,又称参数模板
使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。
函数声明的格式非常简单,相当于去掉函数定义中的函数体再加上分号;,如下所示:
返回值类型 函数名( 类型 形参, 类型 形参… );
也可以不写形参,只写数据类型:
返回值类型 函数名( 类型, 类型…);
①一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数。
②友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用。
③友元函数在调用上同一般函数一样,不必通过对对象进行引用。
String函数有3个方法,分别是:
1、String.fromCharCode():通过一串Unicode编码创建字符串。
2、String.fromCodePoint():通过一串码点创建字符串。
3、String.raw():通过模板字符串创建字符串。
String.fromCharCode()
该方法返回一个由一组Unicode值序列组成字符串。
var str = String.fromCharCode(65,66,67);
str; // ABC
该方法无法识别大于0xFFFF的码点,即无法识别32位的UTF-16字符。比如" "这个字符的Unicode编码是0x20BB7。
var str = String.fromCharCode(0x20BB7);
str; // "ஷ"
String.fromCodePoint()
String.fromCodePoint()方法用来弥补String.fromCharCode()无法识别32位UTF-16字符的不足。
var str = String.fromCharCode(0x20BB7);
str; // " "
String.raw()
String.raw()方法是一个模板字符串的处理函数,用来获取一个模板字符串的原始字面值。类似于Python的字符串前缀“r”和C#的字符串前缀“@”。
// 对于模板字符串
var t = `Hi\\n5!`;
// 可以通过String.raw方法来构建
var r = String.raw`Hi\n5!`;
r === t; // true
对于String.raw方法,通过不需要把它看成一个普通函数,只需要把它放在模板字符串前面就可以了。但接在它后面的模板字符串,不需要对反斜线进行转义。
当String.raw方法用作普通函数调用时,第一个参数应该是一个具有raw属性的对象,其raw属性的值应该是一个数组或类数组对象。
var a = String.raw({ raw: "test" }, 0, 1, 2 );
a; // "t0e1s2t;
// 等同于
var b = String.raw({ raw: ['t', 'e', 's', 't'] }, 0, 1, 2 );
b; // "t0e1s2t;
a === b; // true
Python非常方便,它不需要用户查询文档,只需掌握如下两个帮助函数,即可查看Python中的所有函数(方法)以及它们的用法和功能:
dir():列出指定类或模块包含的全部内容(包括函数、方法、类、变量等)。
help():查看某个函数或方法的帮助文档。
相关推荐:《Python基础教程》
例如,要查看字符串变量(它的类型是 str 类型)所能调用的全部内容,可以在交互式解释器中输入如下命令:>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__',
使用模板是为了实现泛型,可以减轻编程的工作量,增强函数的重用性。例如将两个变量交换的函数swap;如果不是用模板的话我们需要针对不同的类型写很多个功能相同的函数,例如int、char等等而使用模板的话则只用使用一个函数就足够了template
不行。
目前c++还不支持模板定义与实现分开的写法,不过,这个功能已经在0x标准里出现了。
函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。
绝对值函数的性质有以下几点:
1、任何有理数的绝对值都是大于或者等于0的数,这是绝对值的非负性。
2、绝对值等于0的数只有一个,这个数那就是0。
3、绝对值等于同一个正数的数有两个,这两个数互为相反数。
4、互为相反数的两个数的绝对值相等
函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。
模板类英文为class template,template的中文翻译为模板,所以模板类的意思其实是:类的模板。
顾名思义,模板类是相当于一个模具,当参数给定时,生成具体的类,也叫实例化。它的提出主要是为了减少代码重复。
例如,我们可以用下面的代码交换两个数b和c
a = b;
b = c;
c = a;
这个交换过程与a,b,c的具体类型没有关系,因此我们可以用它来交换两个整数,或者两个浮点数。更一般的,我们可以用来交换两个具有赋值运算符的类型。因此,可以用模板进行一般化:
template<class T>
void swap(T &b, T &c){
a = b;
b = c;
c = a;
}
当然,上面介绍的这个不是模板类,而是模板函数。不过他们的概念是类似的。其中一开始的template代表后面尖括号中的是模板参数(类似于函数的参数),class代表参数是类(相应的,可以用template<int N>来声明整型参数)。后面的代码和的函数基本没有区别,只是用T来代替了具体的类型,例如int,double等。根据需要我们可以用swap<int>(b,c)来交换两个整数,swap<double>(b,c)交换两个浮点数。由于编译器可以根据b,c的具体类型推导T的具体含义,因此可以简写为swap(b,c)。
回到模板类,假设我们需要一个类型来代表动态数组,且该类型支持size成员函数。如果是整型的类,我们可能会写
class vector_int{
size_t size() const;
};
如果某一天,我们又需要浮点类型的动态数组,可能又会写
class vector_double{
size_t size() const;
};
于是就会发现它们的代码是如此的类似,因此我们希望将它一般化。如同swap函数的做法,我们将它定义为模板类:
template<class T>
class vector{
size_t size() const;
};
因此,vec_int等同于vector<int>,而vector_double等同于vector<double>。因为运用模板类的语法类似于
vector<T> a;
因此,编译器没办法为我们推导T的具体含义,所以不能像模板函数一样进行简写。
当然,上面是比较简单的情况,有时候我们需要的类在大多数情况下是一样的,但是对于某几个特殊情形可能不太一样,例如我们可能希望对于bool类型的数组能尽量减少内存的使用,用一个比特位代表一个bool值。从而,我们的数组不是通过bool a[10]的形式来定义。在这种情况下,c++提供了模板特化,也就是说当模板的参数取某个具体的值时,我们使用不同的模板,定义方式如下:
template<>
class vector<bool>{
size_t size() const;
};
因为,它是一个特化的模板类,所以只有普通模板存在的情况下,它的存在才是合法的,不然我们是对什么进行特化的呢?