21天学通C++——第四-七章

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;
}
image-20230101204411834

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,这会让编译器根据返回的值来推断函数的返回类型,而不直接指定返回类型。

使用自动推断返回类型注意:

  1. 必须先定义(即实现)再调用。在此例子中,如果把Area的定义放在main之后,即是在main前声明了Area函数,也会报错:error: use of ‘auto Area(double)’ before deduction of ‘auto’。
  2. 这种函数包含多条 return 语句,必须确保根据它们推断出的返回类型都相同。
  3. 在递归调用后面,至少得有一条 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,这相当于将集合按升序排列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值