标题
CH4-CH6:
初识动态数组vector,包含头文件<vector>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> myNumber(3);//declare a dynamic int array ,whose size is 3
cout << "please input vector int myNumber's values:";
for (int i = 0; i < 3; i++)
{
cin >> myNumber[i];
}
cout << "myNumber:";
for (int i = 0; i < 3; i++)
{
cout << myNumber[i] << endl;
}
cout << "myNumber's size: " << myNumber.size() << endl;//size of vector
//insert into vector
cout << "Enter another element to insert" << endl;
int newValue = 0;
cin >> newValue;
myNumber.push_back(newValue);
cout << "new myNumber:" << endl;
for (int i = 0; i < 4; i++)
{
cout << myNumber[i] << endl;
}
}
更安全的字符串类型:String,包含头文件<String>
#include <iostream>
#include <string>
using namespace std;
int main()
{
//1.initialize a string:“()”or “=”
string str1 ("Hello std::String!");
//string str1 = "Hello std::String!";
cout << str1 << endl;
//2.concatenate two strings by "+" operator
string str2 = "hello";
string str3 = ", C++!";
cout << str2 + ' ' + str3 << endl;
//3.copy a string by "=" operator
string str4 = str2 + " " + str3;
cout << str4 << endl;
//4.get length of a string: string.length()
cout << str4.length() << endl;
return 0;
}
尽量避免使用C语言的char字符数组
基于范围的for循环
C++11引入的新的for循环,基本用法如下:
for (VarType varName : sequence)
{
// Use varName that contains an element from sequence
}
/*通过使用关键字 auto 来自动推断变量的类型,可编写一个通用的 for 循环,对任何类型
的数组 elements 进行处理,从而进一步简化前面的 for 语句:*/
for (auto anElement : elements) // range based for
cout << "Array elements are " << anElement << endl;
用法:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int someNums[] = {1, -8, 6, 207, 325};
for (const int& aNum : someNums) //const int&:quotation passing
{
cout << aNum << " ";
}
cout << endl;
for (auto aNum : {1, 2, 3, 4, 5})
{
cout << aNum << " ";
}
cout << endl;
char charArray[] = {'h', 'e', 'l', 'l', 'o'};
for (auto aChar : charArray)
{
cout << aChar << " ";
}
cout << endl;
string sayHello { "Hello Wkm!" };
for (auto element_String : sayHello)
{
cout << element_String << " ";
}
cout << endl;
return 0;
}
CH7:函数
带默认值的函数
#include <iostream>
#include <string>
using namespace std;
double Area (double radius, double Pi = 3.14);
int main()
{
cout << Area(1) << endl;
cout << Area(1, 3.1415926) << endl;
return 0;
}
double Area (double radius, double Pi)
{
return Pi * radius * radius;
}
带默认值的参数必须位于参数列表的末尾;或者所有的参数均设置为带有默认值的参数。
函数重载
重载函数:名称和返回类型相同,但参数不同的函数。
#include <iostream>
#include <string>
using namespace std;
const double PI = 3.1415926;
double Area (double radius);
double Area (double radius, double height);
int main()
{
cout << Area(5) << endl; //78.5398
cout << Area(5, 3); //251.327
return 0;
}
double Area (double radius)
{
return PI * radius * radius;
}
double Area (double radius, double height)
/*
functional name and returning type is same
parameters are not same
*/
{
return 2 * PI * radius * radius + 2 * PI * radius * height;
}
两个函数名称相同(Area)、返回值类型相同(double)。但是参数不同, 第二个Area多了个height。
按引用传递参数
#include <iostream>
#include <string>
using namespace std;
const double PI = 3.1415926;
void Area(double radius, double& result)
{
result = PI * radius * radius;
}
int main()
{
double radius = 0, area_result = 0;
cin >> radius;
Area(radius, area_result); // input 5
cout << area_result; //78.5398
return 0;
}
注意Area的第二个参数:double& result
表示:将指向该实参的引用传递给函数。在此例子中,函数的参数result和main中的area_result指向同一内存单元。根据需要函数返回值类型也变为void。
引用参数也是函数传递多个返回值的方法之一!
内联函数
使用内联函数的原因:一些十分简单的函数(如下面的例子中的doubleRadius,将参数的2倍返回),执行时间很短,但执行函数调用的开销可能非常高。因此使用关键字 inline 发出请求,要求在函数被调用时就地展开它们。
#include <iostream>
using namespace std;
inline double doubleRadius(double radius)
{
return 2 * radius;
}
int main()
{
cout << doubleRadius(2.3);
return 0;
}
第5行使用关键字inline,编译器通常将该关键字视为请求,请求将函数 doubleRadius()的内容直接放到调用它的地方(第 11行),以提高代码的执行速度。
将函数声明为内联的会导致代码急剧膨胀,在声明为内联的函数做了大量复杂处理时尤其如此。应尽可能少用关键字 inline,仅当函数非常简单,需要降低其开销时(如前面所示),才应使用该关键字。
自动推断返回类型(C++14)
#include <iostream>
using namespace std;
const double PI = 3.1415926;
auto Area(double radius)
{
return PI * radius * radius;
}
int main()
{
double radius = 0;
cin >> radius; // 2
cout << Area(radius); //12.5664
return 0;
}
上述例子中在函数Area的返回类型是auto,这会让编译器根据返回的值来推断函数的返回类型,而不直接指定返回类型。
使用自动推断返回类型注意:
- 必须先定义(即实现)再调用。在此例子中,如果把Area的定义放在main之后,即是在main前声明了Area函数,也会报错:error: use of ‘auto Area(double)’ before deduction of ‘auto’。
- 这种函数包含多条 return 语句,必须确保根据它们推断出的返回类型都相同。
- 在递归调用后面,至少得有一条 return 语句。
初识lambda函数
lambda函数是 C++11 引入的,有助于使用 STL 算法对数据进行排序或处理。
排序函数要求您提供一个二元谓词,以帮助确定元素的顺序。
二元谓词是一个这样的函数,即对两个参数进行比较,并在一个小于另一个时返回 true,否则返回 false。这种谓词通常被实现为类中的运算符,这导致编码工作 非常烦琐。使用 lambda函数可简化谓词的定义。
lambda函数语法:
[optional parameters] (parameter list) { statements;}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void DisplayNums(vector<int>& dynArray)
{
for_each (dynArray.begin(), dynArray.end(), \
[](int Element) {cout << Element << " ";} );
cout << endl;
}
int main()
{
vector<int> myNums;
myNums.push_back(501);
myNums.push_back(-1);
myNums.push_back(25);
myNums.push_back(-35);
DisplayNums(myNums);//501 -1 25 -35
cout << "Sorting them in descending order" << endl;
sort (myNums.begin(), myNums.end(), \
[](int Num1, int Num2) {return (Num2 < Num1); } );
DisplayNums(myNums);//501 25 -1 -35
return 0;
}
第9行的lambda函数:用于显示dynArray中的元素。
第26行:同样地,以lambda函数提供一个二元谓词。在第二个数比第一个数小时返回 true,这相当于将集合按升序排列。