21天C++课程代码(完整版)

//#include <iostream>

//using namespace std;

//int main(int argc, char *argv[])
//{
//    cout << "Hello World!" << endl;
//    return 0;
//}

//1.6.2 -1
//#include<iostream>
//int main()
//{
//    int x =8;
//    int y =6;
//    std::cout << std::endl;
//    std::cout << x - y << " " << x * y <<" "<< x +y;
//    std::cout << std::endl;
//    return 0;
//}

//1.6.2 -3
//#include<iostream>
//int main()
//{
//    std::cout <<"Hello Buddd";
//    return 0;
//}

//2.8.2 -1
//东西太简单,也得去做
//#include<iostream>
//int main()
//{
//    std::cout<<"IS";
//}

//2.8.2 -4
//#include<iostream>
//using namespace std;//std is namespace !
//int a();

//int main()
//{
//    a();
//    return 0;
//}
//int a()
//{
//    cout<<"AAAA"<<endl;
//    return 0;
//}

////3.10.2 -1
//#include<iostream>
//enum YOURCARDS{ACE=43,JACK,QUEEN,KING}; //变量的类型  变量类型中的值  类比一下 比如int
//using namespace std;
//int main()
//{
//    cout<<"QUEEN"<<QUEEN<<endl;
//}

//////3.10.2 -2
//#include<iostream>
//int main()
//{
//    using namespace std;
//    cout<<"size of int: "<<sizeof(int)<<endl;
//    cout<<"size of unsigned int: "<<sizeof(unsigned int)<<endl;
//    cout<<"size of long long: "<<sizeof(long long)<<endl;
//    return 0;
//}

////3.10.2 -3
//#include<iostream>
//int main()
//{
//    const float PI =3.1415926;
//    using namespace std;
//    cout<<"PI: "<<PI<<endl;
//    float circle_radious =3;
//    auto circle_perimeter =0.0;
//    auto circle_area = 0.0;
//    circle_perimeter =2*PI*circle_radious;
//    circle_area = PI*circle_radious*circle_radious;
//    cout<<"circle's perimeter: "<<circle_perimeter<<endl;
//    cout<<"circle's area: "<<circle_area<<endl;
//    return 0;
//}

//3.1
//#include<iostream>
//using namespace std;

//int main()
//{
//    cout<<"This program will help you multiply two numbers"<<endl;
//    cout<<"Enter the first number: "<<endl;
//    int FirstNumber = 11;
//    //cin>>FirstNumber;//qt框架下不能用这个

//    cout<<"Enter the second number: "<<endl;
//    int SecondNumber = 12;
//    //cin>>SecondNumber;

//    int MultiplicationResult =FirstNumber *SecondNumber;
//    cout<<FirstNumber<<" X "<<SecondNumber<<" = ";
//    cout<<MultiplicationResult<<endl;

//    return 0;
//}

////3.2
//#include<iostream>
//using namespace std;

//int MultiplyNumbers()
//{
//    cout<<"Enter the first number: "<<endl;
//    int FirstNumber = 11;
//    //cin>>FirstNumber;//qt框架下不能用这个

//    cout<<"Enter the second number: "<<endl;
//    int SecondNumber = 12;
//    //cin>>SecondNumber;

//    int MultiplicationResult =FirstNumber *SecondNumber;
//    cout<<FirstNumber<<" X "<<SecondNumber<<" = ";
//    cout<<MultiplicationResult<<endl;
//}
//int main()
//{
//    cout<<"This program will help you multiply two numbers"<<endl;
//    MultiplyNumbers();
//    return 0;
//}

////3.3
//#include<iostream>
//using namespace std;

//int FirstNumber = 11;
//int SecondNumber = 12;
//int MultiplicationResult =0;
//int MultiplyNumbers()
//{
//    //cout<<"Enter the first number: "<<endl;

//    //cin>>FirstNumber;//qt框架下不能用这个

//    //cout<<"Enter the second number: "<<endl;

//    //cin>>SecondNumber;

//    MultiplicationResult =FirstNumber *SecondNumber;
//    cout<<FirstNumber<<" X "<<SecondNumber<<" = ";
//    cout<<MultiplicationResult<<endl;
//}
//int main()
//{
//    cout<<"This program will help you multiply two numbers"<<endl;
//    MultiplyNumbers();
//    FirstNumber =1;

//    cout<<FirstNumber<<endl;
//    cout<<SecondNumber<<endl;

//    return 0;
//}

////3.4
//#include<iostream>
//using namespace std;//放哪都行啊

//int main()
//{
//    cout<<"Size of bool: "<<sizeof(bool)<<endl;
//    cout<<"Size of char: "<<sizeof(char)<<endl;
//    cout<<"Size of unsigned char: "<<sizeof(unsigned char)<<endl;
//    cout<<"Size of double: "<<sizeof(double)<<endl;
//    return 0;
//}

////3.5
//#include <iostream>
//using namespace std;
//int main()
//{
//    auto Flag = true;
//    auto Number = 250000;
//    cout<<"Flag = "<<Flag;
//    cout<<" , "<<"sizeof(Flag) = "<<sizeof(Flag)<<endl;
//    cout<<"Number = "<<Number;
//    cout<<" , "<<"sizeof(Number) = "<<sizeof(Number)<<endl;


//}

//#include<iostream>
//int main()
//{
//    using namespace std;
//    const auto PI = 22/7;
//    cout<<"PI is "<<PI<<endl;
////    PI =1;

//}

//#include<iostream>
//using namespace std;
//enum CardinalDirections
//{
//  North =25,
//  South,
//  East,
//  West
//};

//int main()
//{
//    cout<<North<<endl;
//    unsigned short Number=0;
//    Number--;
//    cout<<Number<<" "<<endl;
//}

////4.4
//#include<iostream>
//#include<vector>
//using namespace std;

//int main()
//{
//    vector<int> DynArrNums;
//    DynArrNums.push_back(1);
//    DynArrNums.push_back(11111);
//    DynArrNums.push_back(122);
//    DynArrNums.push_back(122);

//    cout<<"DynArrNums's size: "<<sizeof(DynArrNums)<<endl;
//    cout<<"DynArrNums's size: "<<DynArrNums.size()<<endl;

//    int AnotherNum;
//    AnotherNum =444;
//    DynArrNums.push_back(AnotherNum);

//    //显示最后一个数
//    cout<<"Now: "<<DynArrNums[DynArrNums.size()-1]<<endl;
//    //显示数的大小
//    cout<<"DynArrNum's size is :"<<DynArrNums.size()<<endl;
//    //容量capacity比size多
//    cout<<"DynArrNum's capacity is :"<<DynArrNums.capacity()<<endl;
//    //显示数的大小 对于动态数组,感觉sizeof 不适合
//    cout<<"sizeof(DynArrNum) is :"<<sizeof(DynArrNums)<<endl;
//    return 0;
//}

//4.5
//#include<iostream>
//using namespace std;

//int main()
//{
//    char SayHello[]={'H','e','l','l','o','m','y','w','o','r','l','d','\0'};
////    SayHello[5] = '\0';
//    //cout只能遇到空字符才能停止打印,如果没有空字符的话,程序将崩溃
//    cout<<SayHello<<endl;
//}

////4.6
//#include<iostream>
//#include<string.h>
//#include<string>//两个不一样
//using namespace std;

//int main()
//{
//    cout<<"Enter a word NOT longer than 20 charachers"<<endl;

//    //初始化什么,初始话第一个元素,而不是出初始化全部
//    char UserInput[4] ={'1','2','\0','1'};
//    //sizeof不管反斜杠0的存在
//    cout<<"sizeof(UserInput): "<<sizeof(UserInput)<<endl;
//    //strlen()要遇到反斜杠就停止
//    cout<<strlen(UserInput)<<endl;
//    cout<<UserInput<<endl;
//    return 0;
//}

////4.5
//#include<iostream>
//#include<string>

//using namespace std;

//int main()
//{
//    string Greetings ("hello std::string!");
//    cout<<Greetings<<endl;
//    string A ("AAAAAAAAAAAAAAAAAAAAAAA");
//    //字符串能直接相加
//    Greetings =Greetings+A;
//    string B;
//    //字符串能直接赋值
//    B = Greetings;
//    cout<<"Greetings = "<<Greetings<<endl;
//    cout<<"B = "<<B<<endl;
//}

////5.1
//#include<iostream>
//using namespace std;

//int main()
//{
//    cout<<"hello" \
//    <<endl;

//    return 0;
//}

////5.2
////postincrement and preincrement
//#include<iostream>
//using namespace std;
//int main()
//{
//    int MyInt =101;
//    cout<<"Start value of integer being operated: "<<MyInt<<endl;

//    int PostFixInc = MyInt++;
//    cout<<"Result of Postfix Increment= "<<PostFixInc<<endl;
//    cout<<"After Postfix Increment, MyInt = "<<MyInt<<endl;

//    MyInt =101;
//    int PreFixInc = ++MyInt;
//    cout<<"Result of Pretfix Increment= "<<PreFixInc<<endl;
//    cout<<"After Prefix Increment, MyInt = "<<MyInt<<endl;

//    MyInt =101;
//    int PreFixDec = --MyInt;
//    cout<<"Result of Pretfix Decrement= "<<PreFixDec<<endl;
//    cout<<"After Prefix Decrement, MyInt = "<<MyInt<<endl;

//    MyInt =101;
//    int PostFixDec = MyInt--;
//    cout<<"Result of Postfix Decrement= "<<PostFixDec<<endl;
//    cout<<"After Postfix Decrement, MyInt = "<<MyInt<<endl;

//}

////5.3
//#include<iostream>
//using namespace std;
//int main()
//{
//    unsigned short UShortValue =12;
//    cout<<"UShortValue: "<<UShortValue<<";";
//    cout<<"after preincrement, UShortValue = "<<++UShortValue<<endl;

//}

////5.9
////证明一下右移1位除2,左移一位乘以2的问题
//#include<iostream>
//using namespace std;
//int main()
//{
//    int InPut =2500;
//    int OutPut= InPut<<1;
//    cout<<"OutPut: "<<OutPut<<endl;
//    return 0;
//}

//5.6.2 --2
////优先级
//#include<iostream>
//using namespace std;

//int main()
//{
//    int number =10;
//    int Result = number<<1+1<<1;
//    cout<<"Result: "<<Result<<endl;
//    return 0;
//}

////6.2
//#include<iostream>
//#include<string.h>
//using namespace std;

//int main()
//{
//    char Buffer[20]={'\0'};
//    cout<<"Enter a line of text: "<<endl;
//    string LineEntered;
//    LineEntered = "This fits b!";
//    if(LineEntered.length()<20)
//    {
//        //没有这样的
//        //Buffer = LineEntered;
//        strcpy(Buffer,LineEntered.c_str());
//        cout<<"BUffer contains: "<<Buffer << endl;
//    }
//    return 0;
//}

////6.6
//#include<iostream>
//using namespace std;
//int main()
//{
//    cout<<"Enter two numbers"<<endl;
//    int Num1 = 1, Num2 = 3;
//    int Max =(Num1 > Num2) ? Num1 : Num2;
//    cout<<"Max: "<<Max<<endl;
//    return 0;
//}

////验证让那个for循环
////初始也得判断是否满足条件
//#include<iostream>
//using namespace std;

//int main()
//{
//    for (int Index =1; Index<2;Index++)
//    {
//        cout<<"AAA"<<endl;
//    }
//}

//6.15
////斐波那契数列怎么写
//#include <iostream>
//using namespace std;

//int FibonacciNum(int n)
//{
//    if(n < 0){
//        return -1;
//    }else if(n == 0){
//        return 0;
//    }else if(n == 1){
//        return 1;
//    }else {
//        return(FibonacciNum(n-1) + FibonacciNum(n-2));
//    }
//}

//int main(){
//    int num=10;

//    if((num >= 0) && (num <= 50))
//    {
//        cout<<FibonacciNum(num)<<endl;
//    }
//    else
//    {
//        printf("error!");
//        return 0;
//    }

//    return 0;
//}

////-1 is true
//#include<iostream>
//using namespace std;
//int main()
//{
//    while(-1)
//    {
//        cout<<"-1 is OK "<<endl;
//    }
//}


////6.72  -1
//#include<iostream>
//using namespace std;
//int main()
//{
//    const int ARRAY_LEN = 5;
//    int MyNumber[ARRAY_LEN]={-55,45,9889,0,45};
//    for(int nIndex = ARRAY_LEN-1;nIndex>=0;--nIndex)
//        cout<<"Number["<<nIndex<<"] = "<<MyNumber[nIndex]<<endl;
//    return 0;
//}

////6.7.2 -4
//#include<iostream>
//using namespace std;

//int main()
//{
//    enum RainbowOfColor
//    {
//        Red =0,
//        Orange,
//        Yellow,
//        Green_1,
//        Blue,
//        Green_2,
//        Pink
//    };

//    cout<<"Please Input Color"<<endl;
//    int Color =0;
//    switch(Color)
//    {
//    case Red:
//        cout<<"Red is in the rainbow."<<endl;
//        break;
//    case Orange:
//        cout<<"Orange is in the rainbow."<<endl;
//        break;
//    case Green_1:
//        cout<<"Green_1 is in the rainbow."<<endl;
//        break;
//    case Blue:
//        cout<<"Blue is in the rainbow."<<endl;
//        break;
//    case Green_2:
//        cout<<"Green_2 is in the rainbow."<<endl;
//    case Pink:
//        cout<<"Pink is in the rainbow."<<endl;
//        break;
//    default:
//        cout<<"The color is not in the rainbow"<<endl;
//        break;
//    }
//    return 0;
//}

////7.5
/// 斐波那契数列
//#include<iostream>
//using namespace std;

//int GetFibNumber(int FibIndex)
//{
//    if(FibIndex < 2)
//    {
//        return FibIndex;
//    }
//    else
//    {
//        return(GetFibNumber(FibIndex-2)+GetFibNumber(FibIndex-1));
//    }
//}
//int main()
//{
//    cout<<"Fibonacci"<<endl;
//    int Index =5;

//    cout<<"Fibinacci is "<<GetFibNumber(Index)<<endl;
//}

////7.8
////函数重载和数组传递
//#include<iostream>
//using namespace std;

//void DisplayArray(int Number[],int length)
//{
//    cout<<Number[length-1]<<endl;
//}
//void DisplayArray(char Characters[],int length)
//{
//    cout<<Characters[length-2]<<endl;
//}

//int main()
//{
//    int MyNumbers[5] = {24,58,-1,2,45};
//    DisplayArray(MyNumbers,4);

//    char MyStatement[7] = {'h','e','l','l','o','\0'};
//    DisplayArray(MyStatement,6);

//    return 0;
//}

//7.9
////引用,把值给改了
//#include<iostream>
//using namespace std;
//const double PI = 3.14;
//void Area(double Radius,double& Result)
//{
//    Result = PI*Radius*Radius;
//}
//int main()
//{
//    double Radius = 10;
//    double AreaFetched=0;
//    Area(Radius,AreaFetched);
//    cout<<AreaFetched<<endl;
//    return 0;
//}

////7.11
////lambda
//#include<iostream>
//#include<algorithm>
//#include<vector>
//using namespace std;

//int main()
//{
//    vector<int> MyNumbers;
//    MyNumbers.push_back(1);
//    MyNumbers.push_back(2);
//    MyNumbers.push_back(3);
//    cout<<MyNumbers[MyNumbers.size()-1]<<endl;

//    //怎么看是升序还是降序
//    sort(MyNumbers.begin(),MyNumbers.end(), \
//         [](int Num1,int Num2){return(Num2<Num1);}     );
//    for(int i=0;i<3;i++)
//    {
//        cout<<"Mumber["<<i<<"] = "<<MyNumbers[i]<<endl;
//    }
//}

////8.1
////引用云算法和地址云算符
//#include<iostream>
//using namespace std;
//int main()
//{
//    int Age =30;
//    const double PI =3.14;

//    //use & to find the address in memory
//    cout<<"Integer Age is at: "<< hex << &Age <<endl;
//    cout<<"Double PI is located at "<<hex<< &PI <<endl;
//}

////8.2
//#include<iostream>
//using namespace std;
//int main()
//{
//    int Age = 30;
//    int* pInteger = &Age;

//    //Displaying the value of pointer
//    cout<<"Integer Age is at:"<<pInteger<<endl;
//}

////8.3
//#include<iostream>
//using namespace std;

//int main()
//{
//    int Age =30;
//    int* pInteger = &Age;
//    cout<<"pInteger points to Age now"<<endl;
//    //Display the value of pointer
//    cout<<"pInteger= 0x"<<pInteger<<endl;

//    int DogsAge =9;
//    pInteger = &DogsAge;
//    cout<<"pInteger points to DogsAge now"<<endl;
//    cout<<"pInteger ="<<pInteger<<endl;
//}

//8.4
////解除引用运算符(*)来访问整数值
//#include<iostream>
//using namespace std;
//int main()
//{
//    int Age =30;
//    int DogsAge =9;

//    cout<<"Integer Age= "<<Age<<endl;
//    cout<<"Integer DogsAge"<<DogsAge<<endl;

//    int* pInteger = &Age;
//    cout<<"pInteger = 0x"<<pInteger<<endl;
//    cout<<"*pInteger = "<<*pInteger<<endl;

//    pInteger = &DogsAge;
//    cout<<"pInteger points to DogsAge now"<<endl;
//    cout<<"pInteger = "<<pInteger<<endl;
//    cout<<"*pInteger = "<<*pInteger<<endl;
//}


////8.5
//#include<iostream>
//using namespace std;
//int main()
//{
//    int DogsAge = 30;
//    cout<<"Initialized DogsAge: "<<DogsAge<<endl;
//    int* pAge = &DogsAge;
//    *pAge =1;

//    cout<<"Input stored using pAge at 0x"<<pAge<<endl;
//    cout<<"Integer DogsAge = "<<DogsAge<<endl;
//}

////8.6
//#include<iostream>
//using namespace std;

//int main()
//{
//    int Age =30;
//    double PI = 3.1416;
//    char SayYes = 'y';

//    int* pInt = &Age;
//    double* pDouble =&PI;
//    char* pChar = &SayYes;

//    cout<<"sizeof(int)"<<sizeof(int)<<endl;
//    cout<<"sizeof(double)"<<sizeof(double)<<endl;
//    cout<<"sizeof(char)"<<sizeof(char)<<endl;

//    cout<<"sizeof(pInt)"<<sizeof(pInt)<<endl;
//    cout<<"sizeof(pDouble)"<<sizeof(pDouble)<<endl;
//    cout<<"sizeof(pChar)"<<sizeof(pChar)<<endl;
//}

//8.7
//使用new分配内存,用delete释放他们
//#include<iostream>
//using namespace std;
//int main()
//{
//    int* pAge = new int;

//    cout<<"Enter you dog's age: "<<endl;
//    *pAge =14;
//    cout<<"Age "<<*pAge<<" is stored at "<<pAge<<endl;
////不释放内存也行,但是不太好
//    //    delete pAge;
//}

////8.8
////使用new[]分配内存,使用delete[] 释放他们
//#include<iostream>
//#include<string.h>
//using namespace std;
//int main()
//{
//    string Name ="zhengguoxian";
//    int CharsToAllocate=Name.length()+1;
//    cout<<CharsToAllocate<<endl;
//    char* CopyOfName = new char[CharsToAllocate];

//    strcpy(CopyOfName,Name.c_str());
//    cout<<"Dynamically allocated buffer contains "<<CopyOfName<<endl;
//    delete[] CopyOfName;
//    return 0;

//}

////8.9
//#include<iostream>
//#include<string.h>
//using namespace std;
//int main()
//{
//    cout<<"How many chars you wish to enter?";
//    string Name = "zhengguoxian";
//    int InputNums = Name.length()+1;
//    char* pNumbers = new char [InputNums];
//    strcpy(pNumbers,Name.c_str());
//    char* pCopy = pNumbers;


//    cout<<"Successfully allocated memory for "<<InputNums<<" chars"<<endl;
//    for(int Index=0;Index<InputNums;Index++)
//    {
//        cout<<"Enter number"<<Index<<" : ";
//        cout<<*(pNumbers+Index)<<endl;
//    }
//    for(int Index =0;Index<InputNums;Index++)
//    {
////        cout<<*(pCopy++)<<" ";
////*pCopy++ 等同于 *(pCopy++)
//        cout<<(*(pCopy++))<<" ";
//    }
//    cout<<endl;
//    delete[] pNumbers;
//    return 0;
//}

////8.10
////第一个const 不能修改指针包含的地址的数据
////第二个const 不能修改指针包含的地址
//#include<iostream>
//using namespace std;
//void CalcArea(const double* const pPI,const double* const pRadius, double* const pArea)
//{
//    if(pPI&&pRadius&&pArea)
//    {
//        *pArea = (*pPI)*(*pRadius)*(*pRadius);
//    }
//}

//int main()
//{
//    const double PI=3.1416;
//    double Radius =10;
//    double Area;
//    CalcArea(&PI,&Radius,&Area);
//    cout<<"Area is = "<<Area<<endl;
//}


////8.11
//#include<iostream>
//using namespace std;
//int main()
//{
//    int MyNumbers[5];
//    int* pNumbers = MyNumbers;
//    cout<<"pNumbers = "<<pNumbers<<endl;
//    cout<<"&MyNumbers[0] "<<&MyNumbers[0]<<endl;
//}

//

////8.12
////将解除运算符运用于数组
////将数组运算符应用于指针
//#include<iostream>
//using namespace std;
//int main()
//{
//    const int ARRAY_LEN = 5;
//    int MyNumbers[ARRAY_LEN] ={24,-1,333,111,444};
//    int* pNumbers = MyNumbers;

//    cout<<"Displaying array using pointer syntax,operator*"<<endl;
//    for(int Index = 0;Index<ARRAY_LEN;Index++)
//    {
//        cout<<"Element "<<Index<<"="<<*(MyNumbers+Index)<<endl;
//    }
//    cout<<"Displaying array using pointer with array syntax, operator[]"<<endl;
//    for(int Index=0;Index<ARRAY_LEN;++Index)
//    {
//        cout<<"Element "<<Index<<" = "<<pNumbers[Index]<<endl;
//    }
//}

////8.13
/// 8.14
////???
//#include<iostream>
//using namespace std;
//int main()
//{
//    //bad
//    int* pTemperature;
////    pTemperature = new int;
////    *pTemperature =30;

//    cout<<"Temperature is "<<*pTemperature;
//    delete pTemperature;

//    return 0;
//}

////8.15
////异常处理,在new失败时妥善退出
//#include<iostream>
//using namespace std;
//int main()
//{
//    try
//    {
//        int* pAge =new int [1111111111111111];
//        delete[] pAge;
//    }
//    catch(bad_alloc)
//    {
//        cout<<"Memory allocation failed.Ending program"<<endl;
//    }
//}

////8.16
////使用new(nothrow) 我的程序不起作用
//#include<iostream>
//using namespace std;

//int main()
//{
//    int* pAge = new(nothrow) int[1111111111111111111111111111111111111111111];
//    cout<<pAge;
//    if(pAge)
//    {
//        delete[] pAge;
//    }
//    else
//    {
//        cout<<"Memory allocation failed. Ending program"<<endl;
//    }
//    return 0;
//}


////8.17
////引用是响应变量的别名
//#include<iostream>
//using namespace std;
//int main()
//{
//    int Original =30;
//    cout<<"Original = "<<Original<<endl;
//    cout<<"Original is at address: "<<&Original<<endl;

//    //引用,加了&,只是说它是他的别名,其实都是一样的
//    int& Ref =Original;
//    cout<<"Ref is at address "<<&Ref<<endl;

//    int& Ref2= Ref;
//    cout<<"Ref2 is at address: "<<&Ref2<<endl;
//    cout<<"Ref2 gets value, Ref2 = "<<Ref2<<endl;
//}

////8.18
//#include<iostream>
//using namespace std;

//void ReturnSquare(int& Number)
//{
//  Number*=Number;
//};
//int main()
//{
//    cout<<"Enter a number you wish to square: "<<endl;
//    int Number =10;

//    ReturnSquare(Number);
//    cout<<"Square is "<<Number<<endl;
//    return 0;
//}


////8.19
//#include<iostream>
//using namespace std;
//CalculateSquare(const int& Number, int& Result)
//{
//    Result= Number*Number;
//}
//int main()
//{
//    cout<<"Enter a number you wish to square: "<<endl;
//    int Number =10;
//    int Square =10;
//    CalculateSquare(Number,Square);
//    cout<<"Number"<<Number<<"^2 = "<<Square<<endl;
//}

////8.8.2 -5
//#include<iostream>
//using namespace std;
//int main()
//{
//    int* pNumber = new int;
//    int* pNumberCopy = pNumber;
//    *pNumberCopy = 30;
//    cout<<*pNumberCopy;
////    delete pNumberCopy;
//    delete pNumber;
//}

////9.1
//#include<iostream>
//#include<string>
//using namespace std;
//class Human
//{
//private:
//    string Name;
//    int Age;
//public:
//    void SetName(string HumansName)
//    {
//        Name= HumansName;
//    }

//    void SetAge(int HumansAge)
//    {
//        Age = HumansAge;
//    }

//    void IntroduceSelf()
//    {
//        cout<<"I am "<<Name<<" and am ";
//        cout<<Age<<" years old"<<endl;
//    }
//};

//int main()
//{

//    Human FirstMan;
//    FirstMan.SetName("Adam");
//    FirstMan.SetAge(30);

//    Human FirstWoman;
//    FirstWoman.SetName("Eve");
//    FirstWoman.SetAge(28);
//    FirstMan.IntroduceSelf();
//    FirstWoman.IntroduceSelf();
//}

////9.2
//#include<iostream>
//using namespace std;
//class Human
//{
//private:
//    int Age;
//public:
//    void SetAge(int InputAge)
//    {
//        Age =InputAge;
//    }
//    int GetAge()
//    {
//        if(Age>30)
//          return(Age-2);
//        else
//           return Age;
//    }
//};
//int main()
//{
//    Human FirstMan;
//    FirstMan.SetAge(35);

//    Human FirstWoman;
//    FirstWoman.SetAge(22);

//    cout<<"Age of FirstMan "<<FirstMan.GetAge()<<endl;
//    cout<<"Age of FirstWoman "<<FirstWoman.GetAge()<<endl;
//}



////9.3
////使用构造函数初始化成员变量
//#include<iostream>
//#include<string>
//using namespace std;

//class Human
//{
//private:
//    string Name;
//    int Age;

//public:
//    Human()
//    {
//        Age = 0;
//        cout<<"Constructed an instance of class Human"<<endl;
//    }
//    void SetName(string HumansName)
//    {
//        Name = HumansName;
//    }
//    void SetAge(int HumansAge)
//    {
//        Age = HumansAge;
//    }
//    void IntroduceSelf()
//    {
//        cout<<"I am"+Name<<" and am";
//        cout<<Age<<"years old"<<endl;
//    }
//};
//int main()
//{
//    Human FirstMan;
//    FirstMan.SetName("Adam");
//    FirstMan.SetAge(33);

//    Human FirstWomen;
//    FirstWomen.SetName("Eve");
//    FirstWomen.SetAge(20);


//    FirstMan.IntroduceSelf();
//    FirstWomen.IntroduceSelf();
//}

////9.4
////包含多个构造函数的类
//#include<iostream>
//#include<string>
//using namespace std;
//class Human
//{
//private:
//    string Name;
//    int Age;
//public:
//    Human()
//    {
//        Age = 0;
//        cout<<"Default constructor creates an instance of Human"<<endl;
//    }
//    Human(string HumansName)
//    {
//        Name = HumansName;
//        Age = 0;
//        cout<<"2222222222222222222222222"<<endl;
//    }
//    Human(string HumansName, int HumansAge)
//    {
//        Name = HumansName;
//        Age = HumansAge;
//        cout<<"333333333333333333333333333"<<endl;
//        cout<<Name<<"of"<<Age<<"years"<<endl;
//    }
//    void SetName(string HumansName)
//    {
//        Name =HumansName;
//    }
//    void SetAge(int HumansAge)
//    {
//        Age = HumansAge;
//    }
//    void IntroduceSelf()
//    {
//        cout<<"I am "<<Name<<" and am ";
//        cout<<Age<<" years old"<<endl;
//    }
//};
//int main()
//{
//    Human FirstMan;
//    FirstMan.SetName("AAAA");
//    FirstMan.SetAge(11);

//    Human FirstWomen("EVe");
//    FirstWomen.SetAge(111);

//    Human FirstChild("aaaaa",12);

//    FirstMan.IntroduceSelf();
//    FirstWomen.IntroduceSelf();
//    FirstChild.IntroduceSelf();

//}

////9.6
///初始化列表来设置成员
//#include<iostream>
//using namespace std;
//class Human
//{
//private:
//    int Age;
//    string Name;
//public:
//    Human(string InputName = "Adam",int InputAge =25):Name(InputNamse),Age(InputAge)
//    {
//        cout<<"Constructed a Human called "<<Name;
//        cout<<" , "<<Age<<" years old"<<endl;
//    }
//};
//int main()
//{
//    Human FirstMan;
//    Human FirstWoman("Eve",18);
//}


////9.8
////浅复制
//#include<iostream>
//#include<string.h>
//using namespace std;
//class MyString
//{
//private:
//    char* Buffer;
//public:
//    //Constructor
//    MyString(const char* InitialInput)
//    {
//        if (InitialInput != NULL)
//        {
//            Buffer = new char [strlen(InitialInput)+1];
//            strcpy(Buffer,InitialInput);
//        }
//        else
//        {
//            Buffer =NULL;
//        }
//    }
//    //Destructor
//    ~MyString()
//    {
//        cout<<"Invoking destructor,clearing up"<<endl;
//        if(Buffer != NULL)
//        {
//            delete [] Buffer;
//        }
//    }
//    int GetLength()
//    {
//        return strlen(Buffer);
//    }
//    const char* GetString()
//    {
//        return Buffer;
//    }
//};
//void UseMyString(MyString Input)
//{
//    cout<<"String buffer in Mystring is "<<Input.GetLength();
//    cout<<"charachers long"<<endl;
//    cout<<"Buffer contains: "<<Input.GetString()<<endl;
//    return;
//}
//int main()
//{
//    //找不到一个类似的,主要是字符串的问题。
//    MyString SayHello("Hello from String Class");
//    UseMyString(SayHello);
//}


////9.9
////拷贝构造函数
//#include<iostream>
//#include<string.h>
//using namespace std;

//class MyString
//{
//private:
//    char* Buffer;
//public:
//    //constructor
//    MyString(const char* InitialInput)
//    {
//        cout<<"Constructor: creating new MyString"<<endl;
//        if(InitialInput != NULL)
//        {
//            //动态地分配内存
//            Buffer = new char [strlen(InitialInput)+1];
//            strcpy(Buffer,InitialInput);

//            cout<<"Buffer points to 0x";
//            cout<<(unsigned int*)Buffer<<endl;
//        }
//        else
//        {
//            Buffer =NULL;
//        }
//    }

//    //copy constructor
//    MyString(const MyString& CopySource)
//    {
//        cout<<"Copy constructor: copying from MyString"<<endl;

//        if(CopySource.Buffer != NULL)
//        {
//            Buffer = new char [strlen(CopySource.Buffer)+1];

//            strcpy(Buffer,CopySource.Buffer);

//            cout<<"Buffer points to 0x";
//            cout<<(unsigned int*)Buffer<<endl;
//        }
//        else
//        {
//            Buffer =NULL;
//        }

//    }
//    ~MyString()
//    {
//        cout<<"Invoking destructor, clearing up"<<endl;
//        if(Buffer != NULL )
//        {
//            delete [] Buffer;
//        }
//    }

//    int GetLength()
//    {
//        return strlen(Buffer);
//    }

//    const char* GetString()
//    {
//        return Buffer;
//    }

//};

//void UseMyString(MyString Input)
//{
//    cout<<"String buffer in MyString is "<<Input.GetLength();
//    cout<<" characters long"<<endl;

//    cout<<"Buffer contains "<<Input.GetString()<<endl;
//    return;
//}

//int main()
//{
//    MyString SayHello("Hello from String Class");

//    UseMyString(SayHello);
//    return 0;
//}

//////9.10
//#include<iostream>
//#include<string.h>
//using namespace std;

//class President
//{
//private:
//    President(){};

//    President(const President&);

//    const President& operator=(const President&);

//    string Name;
//public:
//    static President& GetInstance()
//    {
//        static President OnlyInstance;
//        return OnlyInstance;
//    }

//    string GetName()
//    {
//        return Name;
//    }

//    void SetName(string InputName)
//    {
//        Name =InputName;
//    }

//};

//int main()
//{
//    President& Only =President::GetInstance();
//    Only.SetName("ABraham Lincolin");

////    President Second;//因为构造函数私有  //定义一个对象
////    President* Third =new President();//因为构造函数私有//new 一个对象


////    Only = President::GetInstance();//对现有对象的拷贝,拷贝构造函数设为私有,就不能再main函数中使用
//    cout<<"The name of the President is: ";
////    cout<<President::GetInstance().GetName()<<endl;//可以
//    cout<<Only.GetName()<<endl;//可以
//    return 0;
//}

////9.11
////用new实例化对象,在堆中实例化。为了防止内存泄漏,写了一个静态公有函数
//#include<iostream>
//using namespace std;
//class MonsterDB
//{
//private:
//    ~MonsterDB() {};//private destructor

//public:
//    static void DestroyInstance(MonsterDB* pInstance)
//    {
//        delete pInstance;
//    }
//};

//int main()
//{
//    MonsterDB* pMyDateBase = new MonsterDB();

//    MonsterDB::DestroyInstance(pMyDateBase);
//    cout<<"aaaaaa"<<endl;
//    return 0;
//}

////9.12
//sizeof(类)和sizeof(对象)
//#include<iostream>
//#include<string.h>
//using namespace std;

//class MyString
//{
//private:
//    char* Buffer;

//public:
//    MyString(const char* InitialInput)
//    {
//        if(InitialInput != NULL)
//        {
//            Buffer = new char [strlen(InitialInput)+1];
//            strcpy(Buffer,InitialInput);
//        }
//        else
//        {
//            Buffer = NULL;
//        }
//    }
//    //拷贝构造函数
//    MyString(const MyString& CopySource)
//    {
//        if(CopySource.Buffer != NULL)
//        {
//            Buffer = new char [strlen(CopySource.Buffer)+1];
//            strcpy(Buffer,CopySource.Buffer);
//        }
//        else
//        {
//            Buffer = NULL;
//        }
//    }

//    ~MyString()
//    {
//        if(Buffer != NULL)
//        {
//            delete [] Buffer;
//        }
//    }

//    int GetLength()
//    {
//        return strlen(Buffer);
//    }

//    const char* GetString()
//    {
//        return Buffer;
//    }
//};

//class Human
//{
//private:
//    int Age;
//    bool Gender;
//    MyString Name;
//public:
//    Human(const MyString& InputName, int InputAge, bool InputGender):Name(InputName),Age(InputAge),Gender(InputGender){}

//    int GetAge()
//    {
//        return Age;
//    }
//};

//int main()
//{
//    MyString FirstMan("Adam");
//    MyString FirstWoman("Eve");

//    cout<<"sizeof(MyString) = "<<sizeof(MyString)<<endl;
//    cout<<"sizeof(FirstMan) = "<<sizeof(FirstMan)<<endl;
//    cout<<"sizeof(FirstWoman) = "<<sizeof(FirstWoman)<<endl;

//    Human FirstMaleHuman(FirstMan,25,true);
//    Human FirstFemaleHuman(FirstWoman,18,false);

//    cout<<"sizeof(Human) = "<<sizeof(Human)<<endl;
//    cout<<"sizeof(FirstMaleHuman) = "<<sizeof(FirstMaleHuman)<<endl;
//    cout<<"sizeof(FirstFemaleHuman) = "<<sizeof(FirstFemaleHuman)<<endl;
//    cout<<sizeof(int)+sizeof(bool)+sizeof(MyString)<<endl;
//    return 0;

//}

////9.13
////通过友元函数访问私有数据成员
//#include<iostream>
//#include<string.h>
//using namespace std;

//class Human
//{
//private:
//    string Name;
//    int Age;

//    friend void DisplayAge(const Human& Person);

//public:
//    Human(string InputName,int InputAge)
//    {
//        Name = InputName;
//        Age = InputAge;
//    }
//};

//void DisplayAge(const Human& Person)
//{
//    cout<<Person.Age<<endl;
//}

//int main()
//{
//    Human FirstMan("Adam",25);
//    cout<<"Accessing private member Age via friend"<<endl;
//    DisplayAge(FirstMan);
//}

////9.14
//#include<iostream>
//#include<string.h>
//using namespace std;

//class Human
//{
//private:
//    string Name;
//    int Age;
//    friend class Utility;

//public:
//    Human(string InputName, int InputAge)
//    {
//        Name = InputName;
//        Age = InputAge;
//    }
//};

//class Utility
//{
//public:
//    //静态成员
//    static void DisplayAge(const Human& Person)
//    {
//        cout<<Person.Age<<endl;
//    }
//};

//int main()
//{

//    Human FirstMan("Adam",25);
//    cout<<"Accessing private member Age via friend class: ";
//    Utility::DisplayAge(FirstMan);
////    FirstMan.Age =1;


//    return 0;
//}


////10.1
////两个类,都继承基类
//#include<iostream>
//using namespace std;
//class Fish
//{
//public:
//    bool FreshWaterFish;

//    void Swim()
//    {
//        if(FreshWaterFish)
//            cout<<"Swims in lake"<<endl;
//        else
//            cout<<"Swims in sea"<<endl;
//    }
//};

//class Tuna: public Fish
//{
//public:
//    Tuna()
//    {
//        FreshWaterFish =false;
//    }
//};

//class Carp: public Fish
//{
//public:
//    Carp()
//    {
//        FreshWaterFish = true;
//    }
//};

//int main()
//{
//    Carp myLunch;
//    Tuna myDinner;

//    cout<<"Getting my food to swim"<<endl;

//    cout<<"Lunch";
//    myLunch.Swim();

//    cout<<"Dinner";
//    myDinner.Swim();
//}


////10.2
////protected  main函数中不能使用他
////
//#include<iostream>
//using namespace std;

//class Fish
//{
//protected:
//    bool FreshWaterFish;

//public:
//    void Swim()
//    {
//        if(FreshWaterFish)
//            cout<<"Swims in lake "<<endl;
//        else
//            cout<<"Swins in sea "<<endl;
//    }
//};

//class Tuna: public Fish
//{
//public:
//    Tuna()
//    {
//        FreshWaterFish = false;
//    }
//};

//class Carp: public Fish
//{
//public:
//    Carp()
//    {
//        FreshWaterFish =false;
//    }
//};

//int main()
//{
//    Carp myLunch;
//    Tuna myDinner;

//    cout<<"AAAAAAAAAAAAAAA"<<endl;

//    cout<<"Lunch ";
//    myLunch.Swim();

//    cout<<"Dinner ";
//    myDinner.Swim();

////    myLunch.FreshWaterFish = false;//
//    return 0;
//}

////10.3
////派生类构造函数带上初始化列表
//#include<iostream>
//using namespace std;

//class Fish
//{
//protected:
//    bool FreshWaterFish;
//public:
//    Fish(bool IsFreshWater): FreshWaterFish(IsFreshWater){}

//    void Swim()
//    {
//        if(FreshWaterFish)
//           cout<<"Swims in lake"<<endl;
//        else
//            cout<<"Swims in sea"<<endl;
//    }
//};

//class Tuna: public Fish
//{
//public:
//    Tuna():Fish(false) {}
//};

//class Carp: public Fish
//{
//public:
//    Carp():Fish(true) {}
//};

//int main()
//{
//    Carp myLunch;
//    Tuna myDinner;

//    cout<<"Getting my food to swim"<<endl;

//    cout<<"Lunch: ";
//    myLunch.Swim();

//    cout<<"Dinner: ";
//    myDinner.Swim();

//    return 0;
//}

////10.4
////在派生类中实现的方法,就不会去执行基类中的方法
//#include<iostream>
//using namespace std;

//class Fish
//{
//private:
//    bool FreshWaterFish;

//public:
//    Fish(bool IsFreshWater): FreshWaterFish(IsFreshWater) {}

//    void Swim()
//    {
//        if(FreshWaterFish)
//           cout<<"Swims in lake"<<endl;
//        else
//            cout<<"Swims in sea"<<endl;
//    }
//};

//class Tuna: public Fish
//{
//public:
//    Tuna():Fish(false) {}

//    void Swim()
//    {
//        cout<<"AAAAAAAAAAAAAA"<<endl;
//    }
//};

//class Carp: public Fish
//{
//public:
//    Carp(): Fish(true) {}

//    void Swim()
//    {
//        cout<<"BBBBBBBBBBBBBBBBBB"<<endl;
//    }
//};

//int main()
//{
//    Carp myLunch;
//    Tuna myDinner;

//    cout<<"CCCCCCCCCCCCCC"<<endl;

//    cout<<"Lunch";
//    myLunch.Swim();

//    cout<<"Dinner";
//    myDinner.Swim();

//}

////10.5
//::作用域解析运算符
//#include<iostream>
//using namespace std;
//class Fish
//{
//private:
//    bool FreshWaterFish;
//public:
//    Fish(bool IsFreshWater):FreshWaterFish(IsFreshWater) {}

//    void Swim()
//    {
//        if(FreshWaterFish)
//            cout<<"Swims in lake"<<endl;
//        else
//            cout<<"Swims in sea"<<endl;
//    }
//};

//class Tuna:public Fish
//{
//public:
//    Tuna(): Fish(false) {}

//    void Swim()
//    {
//        cout<<"Tuna swims real fast"<<endl;
//    }
//};

//class Carp: public Fish
//{
//public:
//    Carp():Fish(true) {}

//    void Swim()
//    {
//        cout<<"Carp swims real fast"<<endl;
//        Fish::Swim();//调用的是基类的方法
//    }
//};

//int main()
//{
//    Carp myLunch;
//    Tuna myDinner;

//    cout<<"AAAAAAAAAAAA"<<endl;

//    cout<<"Lunch: ";
//    myLunch.Swim();

////    cout<<"Dinner: ";
////    myDinner.Fish::Swim();//调用的是基类的方法
////    myDinner.Swim();//调用的是子类的方法
//}

////10.6
//#include<iostream>
//using namespace std;

//class Fish
//{
//public:
//    void Swim()
//    {
//        cout<<"Fish swims ...!"<<endl;
//    }

//    void Swim(bool FreshWaterFish)
//    {
//        if(FreshWaterFish)
//           cout<<"swims in lake"<<endl;
//        else
//            cout<<"swins in sea"<<endl;
//    }
//};

//class Tuna:public Fish
//{
//public:

//    using Fish::Swim;
//    void Swim()
//    {
//        cout<<"Tuna swims real fast"<<endl;
//    }
//};

//int main()
//{
//    Tuna myDinner;

////    cout<<"Getting my food "<<endl;
////    myDinner.Swim();//调用派生类
////    myDinner.Fish::Swim();//调用基类的方法
////    myDinner.Fish::Swim(true);//调用基类的方法

//    myDinner.Swim(true);// 在派生类中加上using Fish::Swim;
//}

////10.7
////构造函数和析构函数的执行顺序
//#include<iostream>
//using namespace std;

//class FishDummyMember
//{
//public:
//    FishDummyMember()
//    {
//        cout<<"FishDummyMember constructor"<<endl;
//    }
//    ~FishDummyMember()
//    {
//        cout<<"FishDummyMember destructor"<<endl;
//    }
//};

//class Fish
//{
//protected:
//    FishDummyMember dummy;
//public:
//    Fish()
//    {
//        cout<<"Fish constrictor"<<endl;
//    }
//    ~Fish()
//    {
//        cout<<"Fish destructor"<<endl;
//    }
//};

//class TunaDummyMember
//{
//public:
//    TunaDummyMember()
//    {
//        cout<<"TunaDummyMember constructor"<<endl;
//    }

//    ~TunaDummyMember()
//    {
//        cout<<"TunaDummyMember constructor"<<endl;
//    }
//};

//class Tuna: public Fish
//{
//private:
//    TunaDummyMember dummy;

//public:
//    Tuna()
//    {
//        cout<<"Tuna constructor"<<endl;
//    }
//    ~Tuna()
//    {
//        cout<<"Tuna destructor"<<endl;
//    }
//};

//int main()
//{
//    Tuna myDinner;
//}

//#include<iostream>
//using namespace std;

//class Motor
//{
//public:
//    void SwitchIgnition()
//    {
//        cout<<"Ignition ON"<<endl;
//    }

//    void PumpFuel()
//    {
//        cout<<"Fuel in cylinders"<<endl;
//    }

//    void FireCylinders()
//    {
//        cout<<"Vroooom"<<endl;
//    }
//};

//class Car:private Motor
//{
//public:
//    void Move()
//    {
//        SwitchIgnition();
//        PumpFuel();
//        FireCylinders();
//    }
//};

//int main()
//{
//    Car myDreamCar;
//    myDreamCar.Move();
////    myDreamCar.SwitchIgnition();



//    return 0;
//}


////10.9
//#include<iostream>
//using namespace std;
//class Motor
//{
//public:
//    void SwitchIgnition()
//    {
//        cout<<"Ignition ON"<<endl;
//    }

//    void PumpFuel()
//    {
//        cout<<"Fuel in cylinders"<<endl;
//    }

//    void FireCylinders()
//    {
//        cout<<"Vroooom"<<endl;
//    }
//};

//class Car:protected Motor
//{
//public:
//    void Move()
//    {
//        SwitchIgnition();
//        PumpFuel();
//        FireCylinders();
//    }
//};

//class SuperCar: Car
//{
//public:
//    void Move()
//    {
//        SwitchIgnition();
//        PumpFuel();
//        FireCylinders();
//        FireCylinders();
//        FireCylinders();
//    }
//};

//int main()
//{
//    SuperCar myDreamCar;
//    myDreamCar.Move();
//}

////10.8.2  -1
////调用构造函数顺序:依次调用基类的构造函数,在调用派生类的构造函数
//#include<iostream>
//using namespace std;

//class Mammal
//{
//public:
//    Mammal()
//    {
//        cout<<"Mammal constructor"<<endl;
//    }
//};

//class Reptile
//{
//public:
//    Reptile()
//    {
//        cout<<"Reptile constructor"<<endl;
//    }
//};

//class Bird
//{
//public:
//    Bird()
//    {
//        cout<<"Bird constructor"<<endl;
//    }
//};

//class Platypus: public Mammal,public Bird, public Reptile
//{
//public:
//    Platypus()
//    {
//        cout<<"Platypus constructor"<<endl;
//    }
//};

//int main()
//{
//    Platypus real;
//}

////11.1
//#include<iostream>
//using namespace std;

//class Fish
//{
//public:
//    void Swim()
//    {
//        cout<<"Fish swims"<<endl;
//    }
//};

//class Tuna: public Fish
//{
//public:
//    //覆盖了基类Swim()方法
//    void Swim()
//    {
//        cout<<"Tuna swims"<<endl;
//    }
//};

//void MakeFishSwim(Fish& InputFish)
//{
//    InputFish.Swim();
//}

//int main()
//{
//    Tuna myDinner;

//    myDinner.Swim();

//    MakeFishSwim(myDinner);
//}

////11.2
/// 虚函数
#include<iostream>
using namespace std;
class Fish
{
public:
   virtual void Swim()
    {
        cout<<"Fish swims"<<endl;
    }
};

class Tuna:public Fish
{
public:
    void Swim()
    {
        cout<<"Tuna swims"<<endl;
    }
};

class Carp:public Fish
{
public:
    virtual void Swim() override
    {
        cout<<"Carp swims"<<endl;
    }
};

void MakeFishSwim(Fish& InputFish)
{
    InputFish.Swim();
}


int main()
{
    Tuna myDinner;
    Carp myLunch;

//    MakeFishSwim(myDinner);

//    MakeFishSwim(myLunch);


//    myDinner.Swim();
//    myLunch.Swim();

    return 0;
}

////11.3
////在堆中实例化对象,如果将其赋值给基类的指针,该指针调用delete,
////将不会调用派生类的析构函数,这会导致资源未释放,内存泄漏的问题
//#include<iostream>
//using namespace std;
//class Fish
//{
//public:
//    Fish()
//    {
//        cout<<"Fish constructor"<<endl;
//    }
//    ~Fish()
//    {
//        cout<<"Fish destructor"<<endl;
//    }
//};

//class Tuna: public Fish
//{
//public:
//    Tuna()
//    {
//        cout<<"Tuna constructor"<<endl;
//    }
//    ~Tuna()
//    {
//        cout<<"Tuna destructor"<<endl;
//    }
//};

//void DeleteFishMemory(Fish* pFish)
//{
//    delete pFish;
//}

//int main()
//{
//    cout<<"Allocating a Tuna in the free store"<<endl;
//    Tuna* pTuna = new Tuna;//在堆中实例化对象
//    cout<<"Delete the Tuna:"<<endl;
//    DeleteFishMemory(pTuna);//???

//    cout<<"AAAAAAAAAAAAAA"<<endl;
//    Tuna myDinner;

//    return 0;
//}



////11.4
////在堆中实例化对象,如果将其赋值给基类的指针,该指针调用delete,
////将不会调用派生类的析构函数,这会导致资源未释放,内存泄漏的问题
//#include<iostream>
//using namespace std;
//class Fish
//{
//public:
//    Fish()
//    {
//        cout<<"Fish constructor"<<endl;
//    }
//    virtual ~Fish()//确保neic 不泄漏
//    {
//        cout<<"Fish destructor"<<endl;
//    }
//};

//class Tuna: public Fish
//{
//public:
//    Tuna()
//    {
//        cout<<"Tuna constructor"<<endl;
//    }
//    ~Tuna()
//    {
//        cout<<"Tuna destructor"<<endl;
//    }
//};

//void DeleteFishMemory(Fish* pFish)
//{
//    delete pFish;
//}

//int main()
//{
//    cout<<"Allocating a Tuna in the free store"<<endl;
//    Tuna* pTuna = new Tuna;//在堆中实例化对象
//    cout<<"Delete the Tuna:"<<endl;
//    DeleteFishMemory(pTuna);//???

//    cout<<"AAAAAAAAAAAAAA"<<endl;
//    Tuna myDinner;

//    return 0;
//}

////11.6

//#include<iostream>
//using namespace std;
//class Fish
//{
//public:
//    virtual void Swim()=0; //纯虚函数

//};

//class Tuna:public Fish
//{
//public:
//    void Swim()
//    {
//        cout<<"Tuna swims fast in the sea"<<endl;
//    }
//};

//class Carp:public Fish
//{
//    void Swim()
//    {
//        cout<<"Carp swims slow in the lake"<<endl;
//    }
//};

//void MakeFishSwim(Fish& inputFish)
//{
//    inputFish.Swim();
//}

//int main()
//{
//    Fish myFish;
//    Carp myLunch;
//    Tuna myDinner;
//    MakeFishSwim(myLunch);
//    MakeFishSwim(myDinner);

//    return 0;
//}

////11.7
//#include<iostream>
//using namespace std;

//class Animal
//{
//public:
//    Animal()
//    {
//        cout<<"Animal constructor"<<endl;
//    }

//    int Age;
//};

//class Mammal:public Animal
//{

//};

//class Bird:public Animal
//{

//};

//class Reptile:public Animal
//{

//};

//class Platypus:public Mammal,public Bird,public Reptile
//{
//public:
//    Platypus()
//    {
//        cout<<"Platypus constructor"<<endl;
//    }
//};

//int main()
//{
//    Platypus duckBilledP;
////    duckBilledP.Age = 2;//和之前学的矛盾啊?????
////    duckBilledP.Mammal::Animal::Age = 25;//不行
////    duckBilledP.Bird::Animal::Age = 25;
////    duckBilledP.Reptile::Animal::Age = 25;


//}

////11.7
//#include<iostream>
//using namespace std;

//class Animal
//{
//public:
//    Animal()
//    {
//        cout<<"Animal constructor"<<endl;
//    }

//    int Age;
//};

//class Mammal:public virtual Animal
//{

//};

//class Bird:public virtual Animal
//{

//};

//class Reptile:public virtual Animal
//{

//};

//class Platypus:public Mammal,public Bird,public Reptile
//{
//public:
//    Platypus()
//    {
//        cout<<"Platypus constructor"<<endl;
//    }
//};

//int main()
//{
//    Platypus duckBilledP;
//    duckBilledP.Age = 2;//和之前学的矛盾啊?????
////    duckBilledP.Mammal::Animal::Age = 25;//不行
////    duckBilledP.Bird::Animal::Age = 25;
////    duckBilledP.Reptile::Animal::Age = 25;


//}

////11.6.1--1
//#include<iostream>
//using namespace std;

//class Shape
//{
//public:
//    virtual double Area() =0;//纯虚函数,使基类变成抽象基类
//    virtual void Print() =0;
//};

//class Circle:public Shape
//{
//    double Radius;
//public:
//    Circle(double inputRadius) :Radius(inputRadius) {}

//    double Area()
//    {
//        return 3.1416*Radius*Radius;
//    }

//    void Print()
//    {
//        cout<<"Circle says hello"<<endl;
//    }
//};

//class Triangle:public Shape
//{
//    double Base,Height;
//public:
//    //构造函数
//    Triangle(double inputBase,double inputHeight): Base(inputBase),Height(inputHeight) {}

//    double Area()
//    {
//        return 0.5*Base*Height;
//    }

//    void Print()
//    {
//        cout<<"Triangle says hello"<<endl;
//    }
//};

//int main()
//{
//    Circle myRing(5);
//    Triangle myTriangle(1,2);
//    cout<<"Area of Circle :"<<myRing.Area()<<endl;
//    cout<<"Area of Triangle: "<<myTriangle.Area()<<endl;

//    myRing.Print();
//    myTriangle.Print();

//}

////12.1
////单目递增与单目递减云算符
//#include<iostream>
//using namespace std;
//class Date
//{
//private:
//    int Day;
//    int Month;
//    int Year;
//public:
//    Date(int InputDay,int InputMonth, int InputYear):Day(InputDay),Month(InputMonth),Year(InputYear) {};

//    //???
//    Date& operator ++ ()
//    {
//        ++Day;
//        return *this;
//    }

//    Date& operator -- ()
//    {
//        --Day;
//        return *this;
//    }
//    void DisplayDate()
//    {
//        cout<<Day<<" / "<<Month<<" / "<<Year<<endl;
//    }
//};

//int main()
//{
//    Date Holiday(31,12,2011);

//    cout<<"The date object is initialized to: ";
//    Holiday.DisplayDate();

//    //???
//    ++Holiday;

//    cout<<"AAAAAAAAAAAAAA"<<endl;

//    Holiday.DisplayDate();

//    --Holiday;
//    --Holiday;

//    cout<<"BBBBBBBBBBBB"<<endl;

//    Holiday.DisplayDate();
////    cout<<Holiday;
//    return 0;

//}


////12.2
////单目递增与单目递减云算符
//#include<iostream>
//#include<sstream>
//#include<string.h>
//using namespace std;
//class Date
//{
//private:
//    int Day;
//    int Month;
//    int Year;
//    string DateInString;
//public:
//    Date(int InputDay,int InputMonth, int InputYear):Day(InputDay),Month(InputMonth),Year(InputYear) {};

//    operator const char*()
//    {
//        ostringstream formattedDate;
//        formattedDate<<Day<<"/"<<Month<<"/"<<Year;

//        DateInString = formattedDate.str();
//        return DateInString.c_str();
//    }
//};

//int main()
//{
//    Date Holiday(31,12,2011);

////    cout<<Holiday;

//    string strHoliday(Holiday);
//    cout<<strHoliday;
//}

//12.3
//#include<iostream>
//#include<memory>
//using namespace std;

//class Date
//{
//private:
//    int Day;
//    int Month;
//    int Year;

//    string DateInString;

//public:
//    Date(int InputDay,int InputMonth,int InputYear):Day(InputDay),Month(InputMonth),Year(InputYear) {};

//    void DisplayDate()
//    {
//        cout<<Day<<"/"<<Month<<"/"<<Year<<endl;
//    }
//};

//int main()
//{
//    //智能指针类unique_ptr,
//    unique_ptr<int> pDynamicAllocInteger(new int);
//    //??  *(地址) = 值    &(变量) = 地址 有啥区别
//    *pDynamicAllocInteger =42;

//    cout<<"Integer value is "<<*pDynamicAllocInteger<<endl;

//    unique_ptr<Date> pHoliday(new Date(25,11,2011));
//    cout<<"The new instance of date contains: ";
//    pHoliday->DisplayDate();

//    int Age =30;
//    //
//    int* pInteger = &Age;

//    cout<<*pInteger<<endl;

//    return 0;
//}


////12.4
////怎么看是智能指针呢!!!
//#include<iostream>
//using namespace std;

////???类似函数重载的功能  函数模板
//template <typename T>

//class smart_pointer
//{
//private:
//    T* m_pRawPointer;
//public:
//    smart_pointer(T* pData):m_pRawPointer(pData) {};
//    ~smart_pointer(){delete m_pRawPointer;}

//    //???
//    T& operator*() const
//    {
//        return *(m_pRawPointer);
//    }

//    //??? 一用这个->符号,我就调用这个函数吗  那是固定的格式吗
//    T* operator-> () const
//    {
//        return m_pRawPointer;
//    }
//};

//class Date
//{
//private:
//    int Day,Month,Year;
//    string DateString;
//public:
//    Date(int InputDay,int InputMonth, int InputYear): Day(InputDay),Month(InputMonth),Year(InputYear) {};
//    void DisplayDate()
//    {
//        cout<<Day<<" / "<<Month<<" / "<<Year<<endl;
//    }
//};

//int main()
//{
//    //加了一个模板就不知道
//    smart_pointer<int> pDynamicInt(new int(43));
//    cout<<"BBBB"<<*pDynamicInt<<endl;

//    //smartpointer 也是类,Date也是类???//模板类什么回事
//    //原本应该是Date pDate(new Date(25,12,2011));加了一个smart_pointer是啥玩意呢?
//    smart_pointer<Date> pDate(new Date(25,12,2011));
//    cout<<"AAAA";
//    pDate->DisplayDate();

//    //这是一种
////    Date pDate(25,12,2011);
////    pDate.DisplayDate();

////    //第二种
////    Date* pDate(new Date(25,12,2011));
////    (*pDate).DisplayDate();
////    pDate->DisplayDate();//这个也行

////    int* pDynamicInt(new int(43));
////    cout<<"DDDD"<<*pDynamicInt<<endl;


//}

////12.5来
//#include<iostream>
//using namespace std;

//class Date
//{
//private:
//    int Day, Month, Year;

//public:
//    Date(int InputDay,int InputMonth, int InputYear):Day(InputDay),Month(InputMonth),Year(InputYear) {};

//    Date operator+ (int DaysToAdd)
//    {
//        //???
//        Date newDate (Day+DaysToAdd,Month,Year);
//        return newDate;
//    }

//    Date operator- (int DaysToSub)
//    {
//        //???两个的表达的功能是一样的
////        return Date(Day-DaysToSub,Month,Year);
//        Date newDate1 (Day-DaysToSub,Month,Year);
//        return newDate1;
//    }

//    void DisplayDate()
//    {
//        cout<<Day<<" / "<<Month<<" / "<<"Year"<<endl;
//    }
//};

//int main()
//{
//    Date Holiday(25,12,2011);
//    cout<<"Holiday on: ";
//    Holiday.DisplayDate();
//    Holiday.DisplayDate();

//    //怎么执行法,先运行完运算符,再实例化对象
//    Date PreviousHoliday(Holiday -19);
//    cout<<"Previous holiday on: ";
//    PreviousHoliday.DisplayDate();

//    //Day的值应该变了啊  对对象而言的,不同的对象有不同的值
//    //
//    Date NextHoliday(Holiday +6);
//    cout<<"Next holiday on: ";
//    NextHoliday.DisplayDate();
//}

//12.6
//#include<iostream>
//using namespace std;
//class Date
//{
//private:
//    int Day,Month,Year;
//public:
//    Date(int InputDay,int InputMonth,int InputYear):Day(InputDay),Month(InputMonth),Year(InputYear) {};
//    void operator += (int DaysToAdd)
//    {
//        Day+=DaysToAdd;
//    }

//    void operator -= (int DaysToSub)
//    {
//        Day-=DaysToSub;
//    }

//    void DisplayDate()
//    {
//        cout<<Day<<" / "<<Month<<" / "<<Year<<endl;
//    }
//};

//int main()
//{
//    Date Holiday(25,12,2011);
//    cout<<"Holiday: ";
//    Holiday.DisplayDate();

//    Holiday-=19;
//    Holiday.DisplayDate();
//    cout<<"----------------------"<<endl;
//    Holiday+=25;
//    Holiday.DisplayDate();

//}

////12.7
//#include<iostream>
//using namespace std;

//class Date
//{
//private:
//    int Day,Month,Year;
//public:
//    Date(int InputDay,int InputMonth, int InputYear): Day(InputDay),Month(InputMonth),Year(InputYear) {};

//    //???
//    bool operator == (const Date& compareTo)
//    {
//        return((Day == compareTo.Day)&&(Month == compareTo.Month)&&(Year==compareTo.Year));
//    }
//    //???
//    bool operator != (const Date& compareTo)
//    {
//        return!(this->operator==(compareTo));
//    }

//    void DisplayDate()
//    {
//        cout<<Day<<" / "<<Month<<" / "<<Year<<endl;
//    }
//};



//int main()
//{
//    Date Holiday1(25,12,2011);
//    Date Holiday2(31,12,2011);

//    cout<<"Holiday 1 is ";
//    Holiday1.DisplayDate();
//    cout<<"--------------"<<endl;
//    cout<<"Holiday 2 is ";
//    Holiday2.DisplayDate();

//    if(Holiday1 == Holiday2)
//        cout<<"Holiday1 == Holiday2"<<endl;
//    else
//        cout<<"Holiday1 != Holiday2"<<endl;

//    cout<<"========================="<<endl;

//    if(Holiday1 != Holiday2)
//        cout<<"Holiday1 != Holiday2"<<endl;
//    else
//        cout<<"Holiday1 == Holiday2"<<endl;
//}



//12.9
//#include<iostream>

//using namespace std;

//class Date
//{
//private:
//    int Day,Month,Year;
//public:
//    Date(int InputDay,int InputMonth,int InputYear): Day(InputDay),Month(InputMonth),Year(InputYear) {};

//    bool operator == (const Date& compareTo)
//    {
//        return ((Day == compareTo.Day)&&(Month==compareTo.Month)&&(Year==compareTo.Year));
//    }

//    bool operator < (const Date& compareTo)
//    {
//        if(Year <compareTo.Year)
//            return true;
//        else if(Month<compareTo.Month)
//            return true;
//        else if(Day<compareTo.Day)
//            return true;
//        else
//            return false;
//    }

//    bool operator <= (const Date& compareTo)
//    {
//        if(this->operator == (compareTo))
//            return true;
//        else
//            return this->operator < (compareTo);
//    }

//    bool operator > (const Date& compareTo)
//    {
//        return !(this->operator <= (compareTo));
//    }

//    bool operator >=(const Date& compareTo)
//    {
//        if(this->operator == (compareTo))
//            return true;
//        else
//            return this->operator > (compareTo);

//    }

//    bool operator !=(const Date& compareTo)
//    {
//        return !(this->operator == (compareTo));
//    }

//    void DisplayDate()
//    {
//        cout<<Day<<" / "<<Month<<" / "<<Year<<endl;
//    }
//};

//int main()
//{
// Date Holiday1(20,12,2011);
// Date Holiday2(21,12,2011);

// if(Holiday1<Holiday2)
//     cout<<"Holiday1<Holiday2"<<endl;

// if(Holiday1<=Holiday2)
//     cout<<"Holiday1<=Holiday2"<<endl;

// if(Holiday1>Holiday2)
//     cout<<"Holiday1>Holiday2"<<endl;
// if(Holiday1>=Holiday2)
//     cout<<"Holiday1>=Holiday2"<<endl;
//}

////12.9
//#include<iostream>
//#include<string.h>
//using namespace std;
//class MyString
//{
//private:
//    char* Buffer;

//public:
//    MyString(const char* InitialInput)
//    {
//        if(InitialInput != NULL)
//        {
//            Buffer = new char [strlen(InitialInput)+1];
//            strcpy(Buffer,InitialInput);
//        }
//        else
//        {
//            Buffer =NULL;
//        }
//    }
//    //拷贝构造函数
//    MyString(const MyString& CopySource);
//    //复制赋值运算符
//    //this 当前对象的地址
//    //当前对象是???
//    MyString& operator = (const MyString& CopySource)
//    {
//        if((this != &CopySource)&&(CopySource.Buffer != NULL))
//        {
//            if(Buffer !=NULL)
//                delete [] Buffer;

//            Buffer = new char [strlen(CopySource.Buffer)+1];

//            strcpy(Buffer,CopySource.Buffer);
//        }
//        return *this;
//    }

//    ~MyString()
//    {
//        if(Buffer != Buffer)
//            delete [] Buffer;
//    }

//    int GetLength()
//    {
//        return strlen(Buffer);
//    }
//    //目的:让cout显示类的对象
//    operator const char*()
//    {
//        return Buffer;
//    }
//};

//int main()
//{
//    MyString String1("Hello");
//    MyString String2("World");

//    cout<<"Before assignment: "<<endl;
//    cout<<String1<< String2<<endl;

//    String2 =String1;

//    cout<<"After assignment String2 = String1: "<<endl;
//    cout<<String1<< String2<<endl;

//    return 0;
//}


//12.11
//#include<iostream>
//#include<string.h>
//using namespace std;

//class MyString
//{
//private:
//    char* Buffer;
//    //private default constructor
////    MyString(){}//可以不写
//public:
//    //constructor
//    MyString(const char* InitialInput)
//    {
//        if(InitialInput != NULL)
//        {
//            //为什么要加1呢
//            Buffer = new char [strlen(InitialInput)+1];
//            strcpy(Buffer,InitialInput);
//        }
//        else
//            Buffer = NULL;
//    }
//    //copy constructor
//    MyString(const MyString& CopySource);
//    //copy assignment operator
//    MyString& operator=(const MyString& CopySource);

//    //下标运算符  两个const啥意思呢  后一个const  禁止修改了类的成员属性
//    const char& operator[] (int Index) const
//    {
//        if(Index <GetLength())
//            return Buffer[Index];
//    }

//    ~MyString()
//    {
//        if(Buffer != NULL)
//            delete [] Buffer;
//    }
//    // const是干啥的   禁止修改成员属性c
//    int GetLength() const
//    {
//        return strlen(Buffer);
//    }

//    //目的是cout输出类的对象
//    operator const char* ()
//    {
//        return Buffer;
//    }
//};

//int main()
//{
//    cout<<"Type a statement: ";
//    string strInput = "ABCDEFG";
//    MyString youSaid(strInput.c_str());

//    cout<<"BBBBBBB"<<endl;
//    for(int Index = 0;Index<youSaid.GetLength();++Index)
//        cout<<youSaid[Index]<<" ";
//    cout<<endl;

//    cout<<"enter index 0 dao 6"<<endl;
//    int Index =6;
//    cout<<youSaid[Index]<<endl;
//}

//12.11
//#include<iostream>
//#include<string.h>
//using namespace std;

//class CDisplay
//{
//public:
//    void operator () (string Input) const
//    {
//        cout<<Input<<endl;
//    }
//};

//int main()
//{
//    CDisplay mDisplayFuncObject;
//    mDisplayFuncObject("Display this string!");
//    return 0;
//}


////12.12
//#include<iostream>
//#include<string.h>
//using namespace std;

//class MyString
//{
//private:
//    char* Buffer;

//    //private default constructor
//    //为啥要变为私有呢???
//    //我认为无所谓


//public:
//    MyString(): Buffer(NULL)
//    {
//        cout<<"Default constructor called"<<endl;
//    }

//    //destructor
//    ~MyString()
//    {
//        if(Buffer != NULL)
//            delete [] Buffer;
//    }

//    int GetLength()
//    {
//        return strlen(Buffer);
//    }
//    //用于cout输出类的对象
//    operator const char*()
//    {
//        return Buffer;
//    }
//    //双目运算符
//    MyString operator+ (const MyString& AddThis)
//    {
//        cout<<"operator+ called"<<endl;
//        MyString NewString;

//        if(AddThis.Buffer != NULL)
//        {
//            //两个对象相加
//            NewString.Buffer =new char[GetLength()+strlen(AddThis.Buffer)+1];

//            strcpy(NewString.Buffer,Buffer);
//            strcat(NewString.Buffer,AddThis.Buffer);
//        }
//        return NewString;
//    }

//    //constructor
//    MyString(const char* InitialInput)
//    {
//        cout<<"Constructor called for: "<<InitialInput<<endl;
//        if(InitialInput !=NULL)
//        {
//            Buffer = new char [strlen(InitialInput)+1];
//            strcpy(Buffer,InitialInput);
//        }
//        else
//            Buffer =NULL;
//    }
//    //copy constructor
//    MyString(const MyString& CopySource)
//    {
//        cout<<"Copy constructor to copy from: "<<CopySource.Buffer<<endl;
//        if(CopySource.Buffer !=NULL)
//        {
//            Buffer = new char [strlen(CopySource.Buffer)+1];
//            strcpy(Buffer,CopySource.Buffer);
//        }
//        else
//            Buffer =NULL;
//    }
//    //拷贝赋值运算符
//    MyString& operator= (const MyString& CopySource)
//    {
//        cout<<"Copy assignment operator to copy from: "<<CopySource.Buffer<<endl;
//        if((this != &CopySource)&& (CopySource.Buffer != NULL))
//        {
//            if(Buffer != NULL)
//                delete [] Buffer;
//            Buffer = new char [strlen(CopySource.Buffer)+1];

//            strcpy(Buffer,CopySource.Buffer);

//        }

//        return *this;
//    }
//    //移动构造函数   有了这个,复制构造函数就不会调用了
//    MyString(MyString&& MoveSource)
//    {
//        cout<<"Move constructor to move from"<<MoveSource.Buffer<<endl;
//        if(MoveSource.Buffer != NULL)
//        {
//            Buffer = MoveSource.Buffer;
//            MoveSource.Buffer =NULL;
//        }
//    }
//    //移动赋值构造函数  有了这个,复制赋值构造函数就不会调用了
//    //this 是啥呢  当前对象的地址
//    //返回的是*this 那就是  sayHelloAgain  ,这个就是构造函数
//    MyString& operator= (MyString&& MoveSource)
//    {
//        cout<<"Move assignment operator to move from: "<<MoveSource.Buffer<<endl;
//        if((MoveSource.Buffer != NULL)&&(this != &MoveSource))
//        {
//            delete Buffer;

//            Buffer = MoveSource.Buffer;
//            MoveSource.Buffer = NULL;
//        }
//        return *this;
//    }
//};

//int main()
//{
//    MyString Hello("Hello ");
//    MyString World("World");
//    MyString CPP(" of C++");

//    MyString sayHelloAgain("overwrite this");
////    Hello + World + CPP;
////    cout<<"==========="<<endl;
//    sayHelloAgain = Hello+World+ CPP;
//    cout<<sayHelloAgain<<endl;
//    return 0;
//}


////13.1
////类型转换运算符  因为两种类型不同,所以需要转换
////
//#include<iostream>
//using namespace std;

//class Fish
//{
//public:
//    //虚函数  例子11.2
//    virtual void Swim()
//    {
//        cout<<"Fish swims in water"<<endl;
//    }
//    //虚析构函数   例子11.4
//    virtual ~Fish(){}
//};

//class Tuna: public Fish
//{
//public:
//    void Swim()
//    {
//        cout<<"Tuna swims real fast in the sea"<<endl;
//    }

//    void BecomeDinner()
//    {
//        cout<<"Tuna became dinner in Sushi"<<endl;
//    }
//};

//class Carp:public Fish
//{
//public:
//    void Swim()
//    {
//        cout<<"Carp swims real slow in the lake"<<endl;
//    }

//    void Talk()
//    {
//        cout<<"Carp talked carp"<<endl;
//    }
//};

//void DetectFishType(Fish* InputFish)
//{
//    Tuna* pIsTuna = dynamic_cast<Tuna*>(InputFish);

//    cout<<"pIsTuna"<<pIsTuna<<endl;
//    if(pIsTuna)
//    {
//        cout<<"pIsTuna :"<<pIsTuna<<endl;
//        cout<<"Detected Tuna. Make Tuna dinner: "<<endl;
//        pIsTuna->BecomeDinner();
//    }

//    Carp* pIsCarp = dynamic_cast<Carp*>(InputFish);

//    cout<<"pIsCarp"<<pIsCarp<<endl;
//    if(pIsCarp)
//    {
//        cout<<"pIsCarp :"<<pIsCarp<<endl;
//        cout<<"Detected Carp. Making carp talk:"<<endl;
//        pIsCarp->Talk();
//    }
//    cout<<"Verifying type using virtual Fish::Swim: "<<endl;
//    InputFish->Swim();
//}

//int main()
//{
//    Carp myLunch;
//    Tuna myDinner;

//    DetectFishType(&myDinner);
//    cout<<endl;
//    DetectFishType(&myLunch);

////    char* pszString ="Hello World";
////    int* pBuf = pszString;
//    return 0;
//}

//14.1
//#include<iostream>
//#include<string.h>
//using namespace std;

//#define ARRAY_LENGTH 25
//#define PI 3.1416
//#define MY_DOUBLE double
//#define FAV_WHISKY "Jack Daniels"

//int main()
//{
//    int MyNumbers[ARRAY_LENGTH] ={0,1,2,2};
//    cout<<"Array's length: "<<sizeof(MyNumbers)/sizeof(int)<<endl;
//    cout<<"MyNumbers[5]"<<MyNumbers[20]<<endl;

//    cout<<"Enter a radius:";
//    MY_DOUBLE Radius =10;
//    cout<<"Area is : "<<PI*Radius*Radius<<endl;

//    string FavoriteWhisky(FAV_WHISKY);

//    cout<<"My favorite drink is: "<<FavoriteWhisky<<endl;

//    return 0;
//}

//14.2
//#include<iostream>
//#include<string.h>
//using namespace std;
//#define SQUARE(x) ((x)*(x))
//#define PI 3.1416
//#define AREA_CIRCLE(r) (PI*(r)*(r))
//#define MAX(a,b) (((a)>(b))?(a):(b))
//#define MIN(a,b) (((a)<(b))?(a):(b))

//int main()
//{
////    cout<<"Enter a integer: "<<endl;
//    int Input1 = 12;

////    cout<<SQUARE(Input1)<<endl;
////    cout<<AREA_CIRCLE(Input1)<<endl;

//    int Input2 =143;

//    cout<<MAX(Input1,Input2)<<endl;
//    cout<<MIN(Input1,Input2)<<endl;
//}


//14.3
//#include<iostream>
//#include<string.h>
//using namespace std;

//template <typename Type>
//const Type& GetMax(const Type& value1, const Type& value2)
//{
//    if(value1 > value2 )
//        return value1;
//    else
//        return value2;
//}
//template <typename Type>
//void DisplayComparision(const Type& value1, const Type& value2)
//{
//    cout<<GetMax(value1,value2)<<endl;
//}

//int main()
//{
//    int Int1 = -101,Int2 = 2011;
//    DisplayComparision(Int1,Int2);

//    double Double1 = -101.111,Double2 = 2011.111;
//    DisplayComparision(Double1,Double2);


//}

//14.4
//模板类
//#include<iostream>
//using namespace std;

//template <typename T1=int,typename T2=double>
//class HoldsPair
//{
//private:
//    T1 Value1;
//    T2 Value2;

//public:
//    HoldsPair(const T1& value1,const T2& value2)
//    {
//        Value1 = value1;
//        Value2 = value2;
//    }

//    const T1& GetFirstValue() const
//    {
//        return Value1;
//    }

//    const T2& GetSecondValue() const
//    {
//        return Value2;
//    }
//};

//int main()
//{
//    HoldsPair <> mIntFloatPair(300,10.09);
//    //类<指定模板T1,T2是什么> 对象(传入构造函数参数);
//    HoldsPair<short,char*> mShortStringPair(25,"Learn templates,love C++");

//    //
//    cout<<"The first object contains -"<<endl;
//    cout<<"Value 1: "<<mIntFloatPair.GetFirstValue()<<endl;
//    cout<<"Value 2: "<<mIntFloatPair.GetSecondValue()<<endl;

//    cout<<"................"<<endl;
//    cout<<"Value1: "<<mShortStringPair.GetFirstValue()<<endl;
//    cout<<"Value2: "<<mShortStringPair.GetSecondValue()<<endl;

//    return 0;
//}

////14.5
//初始化模板类的静态成员
//#include<iostream>
//using namespace std;


//template <typename T>
//class TestStatic
//{
//public:
//    static T StaticValue;
//};
//template <typename T> T TestStatic<T>::StaticValue;

//int main()
//{
//    TestStatic<int> Int_Year;
//    Int_Year.StaticValue =2011;
//    TestStatic<int> Int_2;

//    TestStatic<double> Double1;
//    TestStatic<double> Double2;
//    Double2.StaticValue =1011.11;

//    cout<<"Double1.StaticValue: "<<Double1.StaticValue<<endl;
//    cout<<"Int_2.StaticValue: "<<Int_2.StaticValue<<endl;
//}

//14.6
//static_assert用法
//#include<iostream>
//using namespace std;

//template <typename T>
//class EverytingButInt
//{
//public:
//    EverytingButInt()
//    {
//        static_assert(sizeof(T) != sizeof(int),"No int please!");
//        cout<<"OK"<<endl;
//    }
//};


//int main()
//{
//    EverytingButInt<short> test;
//}


////14.7.2   -1
//#include<iostream>
//using namespace std;
//#define SQUARE(x,y) ((x)*(y))

//int main()
//{
////    cout<<"Enter a integer: "<<endl;
//    int Input1 = 12;
//    int Input2 =10;
//    cout<<SQUARE(Input1,Input2)<<endl;
//}

//14.7.2   -2

//#include<iostream>
//using namespace std;

//template <typename Type>
//Type SquareTwoNumber(const Type& value1, const Type& value2)
//{
//    return (value1*value2);
//}
//template <typename Type>
//void DisplayComparision(const Type& value1, const Type& value2)
//{
//    cout<<SquareTwoNumber(value1,value2)<<endl;
//}

//int main()
//{
//    int Int1 = 10,Int2 = 11;
//    DisplayComparision(Int1,Int2);
//}


//14.7.2   -3

//#include<iostream>
//using namespace std;

//template <typename T>
//void SwapTwoNumber( T& value1,  T& value2)
//{
//    T value3;
//    value3 =value1;
//    value1 =value2;
//    value2 =value3;
//}


//int main()
//{
//    int Int1 = 10,Int2 = 11;
//    SwapTwoNumber(Int1,Int2);
//    cout<<"Int1 :"<<Int1<<endl;
//    cout<<"Int2 :"<<Int2<<endl;
//}

////15.1
////在vector中查找元素及位置
//#include<iostream>
//#include<vector>
//#include<algorithm>
//using namespace std;

//int main()
//{
//    vector<int> vecIntegerArray;
//    vecIntegerArray.push_back(50);
//    vecIntegerArray.push_back(2991);
//    vecIntegerArray.push_back(23);
//    vecIntegerArray.push_back(9999);



//    //???vector<int>::iterator  是每个元素的类型
//    //vecIntegerArray.end 最后一个元素的地址再加1
//    auto iArrayWalker = vecIntegerArray.begin();
//    cout<<"show *iArrayWalker"<<*iArrayWalker<<endl;

//    cout<<"The contents of the vector are: "<<endl;
//    while(iArrayWalker != vecIntegerArray.end())
//    {
//        cout<<*iArrayWalker<<endl;
//        ++iArrayWalker;
//    }

////    vector <int>::iterator iElement = find(vecIntegerArray.begin(), vecIntegerArray.end(),9999);
//    auto iElement = find(vecIntegerArray.begin(), vecIntegerArray.end(),9999);

//    if(iElement != vecIntegerArray.end())
//    {
//        int Position = distance(vecIntegerArray.end(),iElement);
//        cout<<"Value"<<*iElement;
//        cout<<"found in the vector at position"<<Position<<endl;
//    }
//    return 0;
//};

//16.1
//#include<iostream>
//#include<string>
////using namespace std;
//int main()
//{
//    using namespace std;
//    const char* constCStyleString = "Hello String";
//    cout<<"Constant string is: "<<constCStyleString<<endl;

//    std::string strFromConst (constCStyleString);
//    cout<<"strFromConst is: "<<strFromConst<<endl;

//    std::string str2("hello string!");
//    std::string str2Copy(str2);

//    cout<<"str2Copy is :"<<str2Copy<<endl;

//    std::string strPartialCopy (constCStyleString,5);
//    cout<<"strPartialCopy"<<strPartialCopy<<endl;

//    std::string strRepeatChars(10,'a');
//    cout<<"strReatChars"<<strRepeatChars<<endl;\
//    return 0;
//}

////16.2
//size_t
//#include<iostream>
//#include<string>
//using namespace std;
//int main()
//{
//    string strSTLString ("hello string");
//    cout<<"SSSSSSSSSSSSSSSSSSSSSSS"<<endl;
//    for(size_t nCharCounter =0;nCharCounter<strSTLString.length();++nCharCounter)
//    {
//        cout<<"Character[" <<nCharCounter << "] is : ";
//        cout<<strSTLString[nCharCounter]<<endl;
//    }
//    cout<<endl;
//    cout<<"..................................."<<endl;
//    int charOffset= 0;
//    string::const_iterator iCharacterLocator;
//    for(iCharacterLocator = strSTLString.begin();iCharacterLocator!=strSTLString.end();++iCharacterLocator)
//    {
//        cout<<"Character["<<charOffset++<<"] is : ";
//        cout<<*iCharacterLocator<<endl;
//    }
//    cout<<endl;
//    cout<<"--------------------------------------"<<endl;
//    cout<<strSTLString.c_str()<<endl;

//}

////16.3
////写上功能
////append 附加
///拼接字符串
//#include<iostream>
//#include<string>

//int main()
//{
//    using namespace std;
//    string strSample1("Hello");
//    string strSample2("String!");

//    strSample1 +=strSample2;
//    cout<<strSample1<<endl;

//    string strSample3("FUN is not needing to use pointers");
//    strSample1.append(strSample3);
//    cout<<strSample1<<endl;

//    const char* constCStyleString = "You however still can!";
//    strSample1.append(constCStyleString);

//    cout<<strSample1<<endl;
//    return 0;
//}

////16.4
//查找字符 find()

//#include<iostream>
//#include<string>
//using namespace std;
//int main()
//{
//    string strSample("Good day String! today is beautiful!");
//    cout<<"The sample string is: "<<endl;
//    cout<<strSample<<endl<<endl;

//    size_t charPos =strSample.find("day",0);

//    if(charPos != string::npos)
//        cout<<"Find instance of \"day\"was found at position " <<charPos;
//    else
//        cout<<"substring not found."<<endl;
//    cout<<endl<<endl;
//    cout<<"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<<endl;
//    //size_t  和int 类型差不多
//    size_t SubstringPos = strSample.find("day",0);
////    cout<<SubstringPos<<endl;
////    //一个非常大的数
////    cout<<string::npos<<endl;
//    while(SubstringPos != string::npos)
//    {
//        cout<<"day found at position :"<<SubstringPos<<endl;
//        int  nSearchPosition = SubstringPos +1;
//        //从nSearchPosition开始查找字符,返回的是字符的位姿
//        SubstringPos =strSample.find("day",nSearchPosition);
//        cout<<SubstringPos<<endl;
//    }

//    cout<<"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"<<endl;

//    const char charToSearch = 'a';
//    charPos = strSample.find(charToSearch,0);
//    cout<<charPos<<endl;
//    while(charPos!= string::npos)
//    {
//        cout<<" ' "<<charToSearch<<"'";
//        cout<<"at position: "<<charPos<<endl;

//        size_t charSearchPos= charPos +1;
//        charPos = strSample.find(charToSearch,charSearchPos);
//    }
//    return 0;

//}

//16.5
//erase用法
//#include<iostream>
//#include<algorithm>
//#include<string>
//using namespace std;

//int main()
//{
//    string strSample("hello SSSSString!String! wake up to a beautiful day!");
//    cout<<strSample<<endl<<endl;
//    //在给定的偏移位置删除指定数目的字符。
//    strSample.erase(13,1);
//    cout<<strSample<<endl<<endl;
//    cout<<"1111111111111111111111111111111111"<<endl;
//    //返回的是啥玩意
//    //不识别大小写
//    //string::iteraSSSStor 是啥玩意 指针
//    //find(first,end,value) 返回的是区间(first,end)中第一个值等于value值的元素位置,若未找到,返回end.函数返回的是迭代器或指针

//    string::iterator iCharS = find(strSample.begin(),strSample.end(),'z');
////    cout<<*iCharS<<endl;
//    if(iCharS != strSample.end())
//        strSample.erase(iCharS);
//    cout<<strSample<<endl;

//    cout<<"2222222222222222222222222222222222222"<<endl;

//    strSample.erase(strSample.begin(),strSample.end());

//    if(strSample.length() ==0)
//        cout<<"empty"<<endl;

//}


//实现函数的反转
//#include<iostream>
//#include<string>
//#include<algorithm>
//using namespace std;

//int main()
//{
//    string strSample("Hello String! We will reverse you");
//    cout<<strSample<<endl;

//    reverse(strSample.begin(),strSample.end());

//    cout<<strSample<<endl;
//}

////16.7
////编译不通过
//#include<iostream>
//#include<string>
//#include<algorithm>

//using namespace std;

//int main()
//{
//    string strSample("hello my world");
//    cout<<strSample<<endl;
//    transform(strSample.begin(),strSample.end(),strSample.begin(), std::toupper);
//    cout<<strSample<<endl;
//}




////16.6.2  -1
////看输入的字符串是否是回文
//#include<string>
//#include<iostream>
//#include<algorithm>

//int main()
//{
//    using namespace std;
//    cout<<"..SRART.."<<endl;
//    string strInput ="abcBa";
//    string strCopy(strInput);

//    reverse(strCopy.begin(),strCopy.end());

//    if(strCopy == strInput)
//        cout<<"OK"<<endl;
//    else
//        cout<<"no"<<endl;
//}

////16.6.2  -2
////计算字符串元音字符的个数
//#include<iostream>
//#include<string>

//using namespace std;

//int GetNumCharacters(string& strInput, char chToFind)
//{
//    int nNumCharactersFound =0;
//    //??size_t 类似于int 类型
//    size_t nCharOffset = strInput.find(chToFind);
//    //string::npos 是一个非常大的数值
////    cout<<string::npos<<endl;
//    while(nCharOffset != string::npos)
//    {
//        ++nNumCharactersFound;
//        nCharOffset = strInput.find(chToFind,nCharOffset+1);
//    }
//    return nNumCharactersFound;
//}

//int main()
//{
//    cout<<"..START.."<<endl;
//    string strInput = "aeioubbb";

//    int nNumVowels = GetNumCharacters(strInput,'a');
//    nNumVowels += GetNumCharacters(strInput,'e');
//    nNumVowels += GetNumCharacters(strInput,'i');
//    nNumVowels += GetNumCharacters(strInput,'o');
//    nNumVowels += GetNumCharacters(strInput,'u');

//    cout<<nNumVowels<<endl;

//    return 0;
//}

////16.6.2  -3
////对一个字符串,每隔一个字符将该字符变成大写
//#include<iostream>
//#include<algorithm>
//#include<string>

//int main()
//{
//    using namespace std;

//    cout<<"..START.."<<endl;
//    string strInput = "abcdefg";
//    for(size_t nCharIndex =0;nCharIndex <strInput.length();nCharIndex+=2)
//    {
//        strInput[nCharIndex] = toupper(strInput[nCharIndex]);
//    }
//    cout<<strInput<<endl;
//}

////16.6.2  -4
////将每个字符隔一个空格再合并

//#include<iostream>
//#include<string>

//using namespace std;

//int main()
//{
//    string str1 = "I";
//    string str2 = "LOVE";
//    string str3 = "YOU";

//    string strOutput = str1 + ' ' + str2 + ' ' + str3;
//    cout<<strOutput<<endl;
//}


////17.1
//向量初始化
//#include<vector>

//int main()
//{
//    std::vector<int> vecIntegers;
//    //这个向量初始化为10个元素,可以更大
//    std::vector<int> vecWithTenElements(10);
//    //10个元素,每个元素初始化为90
//    std::vector<int> vecWithTenInitializedElements(10,90);
//    //将另一个向量进行复制
//    std::vector<int> vecArrayCopy(vecWithTenInitializedElements);
//    //将另一个向量的一些元素进行复制
//    std::vector<int> vecSomeElementsCopied(vecWithTenElements.cbegin(),vecWithTenElements.cbegin()+5);

//}

////17.2使用push_back()插入元素
//#include<iostream>
//#include<vector>
//using namespace std;

//int main()
//{
//    vector<int> vecIntegers;

//    vecIntegers.push_back(50);
//    vecIntegers.push_back(11);
//    vecIntegers.push_back(10);
//    vecIntegers.push_back(91);
//    vecIntegers.push_back(10);
//    vecIntegers.push_back(81);


//    cout<<"OUTPUT"<<vecIntegers.size()<<endl;
//    //不行
//    cout<<vecIntegers<<endl;
//}

////17.3
////向量中插入元素
//#include<iostream>
//#include<vector>
//using namespace std;

//void DisplayVector(const vector<int>& vecInput)
//{
//    for(auto iElement = vecInput.cbegin();iElement != vecInput.cend(); ++iElement)
//    {
//        cout<<*iElement<<" ";

//    }
//}

//int main()
//{
//    //向量初始化为4个元素,每个元素的值为90
//    vector<int> vecIntegers(4,90);
//    DisplayVector(vecIntegers);
//    cout<<endl;
//    //在向量的开头插入元素25
//    vecIntegers.insert(vecIntegers.begin(),25);
//    //在向量的末尾插入2个元素 45
//    vecIntegers.insert(vecIntegers.end(),2,45);
//    //显示向量
//    DisplayVector(vecIntegers);
//    cout<<endl;
//    vector<int> vecAnother(4,30);
//    //在第二个位置插入另一个向量
//    vecIntegers.insert(vecIntegers.begin()+1,vecAnother.begin(),vecAnother.end());
//    DisplayVector(vecIntegers);
//}

////17.4
//访问向量元素并修改
//#include<iostream>
//#include<vector>
//using namespace std;

//int main()
//{
//    vector<int> vecIntegerArray;

//    vecIntegerArray.push_back(11);
//    vecIntegerArray.push_back(12);
//    vecIntegerArray.push_back(123);
//    vecIntegerArray.push_back(11111);

//    for(size_t Index =0;Index <vecIntegerArray.size();Index++)
//    {
//        cout<<vecIntegerArray[Index]<<" ";
//    }
//    cout<<endl;
//    vecIntegerArray[2] =11111;
//    cout<<vecIntegerArray[2]<<endl;
//}


////17.5
//用指针访问vector中的元素
//#include<iostream>
//#include<vector>
//using namespace std;

//int main()
//{
//    vector<int> vecIntegers;

//    vecIntegers.push_back(11);
//    vecIntegers.push_back(12);
//    vecIntegers.push_back(1111);
//    vecIntegers.push_back(12221);
//    vector<int>::iterator iElementLocator = vecIntegers.begin();

//    while(iElementLocator != vecIntegers.end())
//    {
//        cout<<*iElementLocator<<" ";
//        ++iElementLocator;
//    }
//}

////17.6
////使用pop_back 删除最后一个元素
//#include<iostream>
//#include<vector>
//using namespace std;

//template <typename T>
//void DisplayVector(const vector<T>& vecInput)
//{
//    for(auto iElement = vecInput.cbegin();iElement != vecInput.cend();iElement++)
//    {
//        cout<<*iElement<<" ";
//    }
//}

//int main()
//{
//    vector<int> vecIntegers;
//    vecIntegers.push_back(1);
//    vecIntegers.push_back(12);
//    vecIntegers.push_back(1111);
//    vecIntegers.push_back(2222);

//    DisplayVector(vecIntegers);
//    cout<<endl;
//    vecIntegers.pop_back();
//    DisplayVector(vecIntegers);
//}


//17.7  演示size()和capacity()
//#include<iostream>
//#include<vector>
//using namespace std;

//int main()
//{
//    vector<int> vecIntegers(5);

//    cout<<vecIntegers.size()<<endl;
//    cout<<vecIntegers.capacity()<<endl;
//    cout<<endl;

//    vecIntegers.push_back(1);

//    cout<<vecIntegers.size()<<endl;
//    cout<<vecIntegers.capacity();
//    cout<<endl;
//    vecIntegers.push_back(12);
//    cout<<vecIntegers.size()<<endl;
//    cout<<vecIntegers.capacity();

//}


//17.8
//在开头插入元素
//在开头删除元素
//#include<deque>
//#include<iostream>
//#include<algorithm>
//using namespace std;

//int main()
//{
//    deque<int> dqIntegers;
//    dqIntegers.push_back(1);
//    dqIntegers.push_back(12);
//    dqIntegers.push_back(12);

//    //在数组的开头插入元素
//    dqIntegers.push_front(1);
//    dqIntegers.push_front(2);
//    dqIntegers.push_front(3);

//    for(size_t nCount = 0;nCount <dqIntegers.size(); ++nCount)
//    {
//        cout<<dqIntegers[nCount]<<" ";
//    }
//    cout<<endl;
//    dqIntegers.pop_front();

//    for(size_t nCount = 0;nCount <dqIntegers.size(); ++nCount)
//    {
//        cout<<dqIntegers[nCount]<<" ";
//    }

//}

//#include<vector>
//#include<iostream>

//using namespace std;

//int main()
//{
//    vector<int> vecData;
//    vecData.push_back(11);
//    vecData.push_back(12);
//    vecData.push_back(13);
//    cout<<vecData[2]<<endl;
//}

////8.1
//#include<list>
//#include<vector>

//int main()
//{
//    using namespace std;

//    list<int> listIntegers;
//    list<int> listWith10Integers(10);
//    list<int> listWith4IntegerEach99(10,99);
//    list<int> listCopyAnother(listWith4IntegerEach99);

//    vector<int> vecIntegers(10,2011);
//    list<int> listContainsCopyOfAnother(vecIntegers.cbegin(),vecIntegers.cend());

//    return 0;

//}

////18.2
////使用push_back和push_front插入元素
//#include<list>
//#include<iostream>
//using namespace std;

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement = Input.cbegin();iElement !=Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    std::list <int> listIntegers;
//    listIntegers.push_front(10);
//    listIntegers.push_front(2011);
//    listIntegers.push_back(-1);
//    listIntegers.push_back(11);
//    DisplayContents(listIntegers);
//}


//18.3
//在list中插入元素的各种方法
//#include<iostream>
//#include<list>
//using namespace std;

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<' ';
//    }
//    cout<<endl;
//}

//int main()
//{
//    list<int> listIntegers1;
//    listIntegers1.insert(listIntegers1.begin(),2);
//    listIntegers1.insert(listIntegers1.begin(),1);

//    listIntegers1.insert(listIntegers1.end(),3);

//    cout<<"The contents of list 1 after inserting elements"<<endl;
//    DisplayContents(listIntegers1);

//    list<int> listIntegers2;
//    listIntegers2.insert(listIntegers2.begin(),4,2);

//    cout<<"The contents of list 2 after inserting"<<endl;
//    cout<<listIntegers2.size()<<endl;
//    DisplayContents(listIntegers2);

//    list<int> listIntegers3;
//    listIntegers3.insert(listIntegers3.begin(),listIntegers1.begin(),listIntegers1.end());
//    cout<<"the contents of list 3 after inserting the contents of ";
//    cout<<"list 1 at the begining"<<endl;
//    DisplayContents(listIntegers3);

//    listIntegers3.insert(listIntegers3.end(),listIntegers2.begin(),listIntegers2.end());
//    cout<<"the contents of list 3 after inserting the contents of";
//    cout<<"list 2 at the end"<<endl;
//    DisplayContents(listIntegers3);
//}

////18.4
////删除list中的元素
//#include<list>
//#include<iostream>
//using namespace std;

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    std::list<int> listIntegers;
//    listIntegers.push_back(4);
//    listIntegers.push_front(3);
//    listIntegers.push_back(5);

//    auto iValue2 =listIntegers.insert(listIntegers.begin(),2);
//    cout<<"Initial contents of the list:"<<endl;
//    DisplayContents(listIntegers);

//    listIntegers.erase(listIntegers.begin(),iValue2);
//    cout<<"contents after erasing a range of elements:"<<endl;
//    DisplayContents(listIntegers);

//    cout<<"After erasing element"<<*iValue2<<endl;
//    listIntegers.erase(iValue2);
//    DisplayContents(listIntegers);

//    listIntegers.erase(listIntegers.begin(),listIntegers.end());
//    cout<<"Number of elements after erasing range:"<<endl;
//    cout<<listIntegers.size()<<endl;
//    return 0;

//}

////使用list::reverse() 反转元素的排列顺序
///18.5
//#include<list>
//#include<iostream>
//using namespace std;

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    std::list<int> listIntegers;
//    listIntegers.push_back(4);
//    listIntegers.push_front(3);
//    listIntegers.push_back(5);
//    DisplayContents(listIntegers);
//    listIntegers.reverse();
//    DisplayContents(listIntegers);

//    return 0;

//}



////18.6
////使用list::sort()将整型list按照升序和降序排列
//#include<list>
//#include<iostream>
//using namespace std;
//bool SortPredicate_Descending(const int& lsh,const int& rsh)
//{
//    return(lsh>rsh);
//}

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    std::list<int> listIntegers;
//    listIntegers.push_back(1);
//    listIntegers.push_front(3);
//    listIntegers.push_back(2);
//    DisplayContents(listIntegers);
//    listIntegers.sort();
//    DisplayContents(listIntegers);
//    listIntegers.sort(SortPredicate_Descending);
//    DisplayContents(listIntegers);
//    return 0;

//}



//18.8
//forward_list 单向链表
//#include<iostream>
//#include<forward_list>
//using namespace std;

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    forward_list<int> flistIntegers;
//    flistIntegers.push_front(1);
//    flistIntegers.push_front(26);
//    flistIntegers.push_front(24);
//    flistIntegers.push_front(23);
//    flistIntegers.push_front(22);
//    DisplayContents(flistIntegers);
//    flistIntegers.remove(23);
//    flistIntegers.sort();
//    DisplayContents(flistIntegers);
//}



////18.7存储对象的list
//#include<string>
//#include<iostream>
//#include<list>

//using namespace std;
//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

////体验一把结构体
//struct ContactItem
//{
//    string strContactsName;
//    string strPhoneNumber;
//    string strDisplayRepresentation;

//    ContactItem(const string& strName,const string& strNumber)
//    {
//        strContactsName = strName;
//        strPhoneNumber = strNumber;
//        strDisplayRepresentation = (strContactsName+' '+strPhoneNumber);
//    }

//    bool operator == (const ContactItem& itemToCompare) const
//    {
//        return (itemToCompare.strContactsName == this->strContactsName);
//    }

//    bool operator < (const ContactItem& itemToCompare) const
//    {
//        return (this->strContactsName<itemToCompare.strContactsName);
//    }

//    operator const char*() const
//    {
//        return strDisplayRepresentation.c_str();
//    }
//};

//bool SortOnPhoneNumber(const ContactItem& item1,const ContactItem& item2)
//{
//    return(item1.strPhoneNumber<item2.strPhoneNumber);
//}

//int main()
//{
//    list<ContactItem> Contacts;
//    Contacts.push_back(ContactItem("Jack","#1"));
//    Contacts.push_back(ContactItem("Bill","#2"));
//    Contacts.push_back(ContactItem("Angle","#3"));
//    Contacts.push_back(ContactItem("Bara","#4"));
//    //为什么显示的是最后一个东西呢
//    DisplayContents(Contacts);
//    Contacts.sort();
//    DisplayContents(Contacts);
//    Contacts.sort(SortOnPhoneNumber);
//    DisplayContents(Contacts);
//    Contacts.remove(ContactItem("Bill",""));
//    DisplayContents(Contacts);
//}



////18.6.2  -2
//#include<iostream>
//#include<list>
//#include<vector>
//using namespace std;

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<' ';
//    }
//    cout<<endl;
//}

//int main()
//{
//    vector<int> vecIntegers1;
//    vecIntegers1.push_back(11);
//    vecIntegers1.push_back(22);

//    list<int> listIntegers3;
//    listIntegers3.push_back(1111);
//    listIntegers3.insert(listIntegers3.end(),vecIntegers1.begin(),vecIntegers1.end());
//    cout<<"the contents of list 3 after inserting the contents of ";
//    cout<<"list 1 at the begining"<<endl;
//    DisplayContents(listIntegers3);


//}




////18.6.2  -3
//#include<iostream>
//#include<list>
//#include<vector>
//using namespace std;

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<' ';
//    }
//    cout<<endl;
//}

//int main()
//{
//    vector<int> vecIntegers1;
//    vecIntegers1.push_back(11);
//    vecIntegers1.push_back(22);

//    list<int> listIntegers3;
//    listIntegers3.push_back(1111);
//    listIntegers3.insert(listIntegers3.end(),vecIntegers1.begin(),vecIntegers1.end());
//    cout<<"the contents of list 3 after inserting the contents of ";
//    cout<<"list 1 at the begining"<<endl;
//    DisplayContents(listIntegers3);


//}

////19.1
////set 和multiset  集合类,他们俩一个可以不可以包含重复,一个可以包含重复的值

//#include<set>

//template <typename T>
//struct SortDescending
//{
//    bool operator()(const T& lhs,const T& rhs) const
//    {
//        return (lhs >rhs);
//    }
//};

//int main()
//{
//    using namespace std;

//    set<int> setIntegers1;
//    multiset<int> msetIntegers1;

//    set<int,SortDescending<int>> setIntegers2;
//    multiset<int,SortDescending<int>> msetIntegers2;

//    set<int> setIntegers3(setIntegers1);
//    multiset<int> msetIntegers3(msetIntegers1.cbegin(),msetIntegers1.cend());
//}

////19.2
////在集合中插入元素

//#include<set>
//#include<iostream>
//using namespace std;
//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement !=Input.cend();++iElement)
//    {
//        cout<<*iElement<<' ';
//    }
//}

//int main()
//{
//    set<int> setIntegers;
//    multiset<int> msetIntegers;

//    setIntegers.insert(60);
//    setIntegers.insert(-1);
//    setIntegers.insert(3000);
//    DisplayContents(setIntegers);

//    msetIntegers.insert(setIntegers.cbegin(),setIntegers.cend());
//    msetIntegers.insert(3000);
//    DisplayContents(msetIntegers);
//    cout<<endl;
//    cout<<msetIntegers.count(3000)<<endl;

//}


////19.3
////查找集合中的元素
//#include<set>
//#include<iostream>
//using namespace std;

//int main()
//{
//    set<int> setIntegers;

//    setIntegers.insert(43);
//    setIntegers.insert(78);
//    setIntegers.insert(-1);
//    setIntegers.insert(124);

//    for(auto iElement =setIntegers.cbegin();iElement != setIntegers.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//    auto iElementFound = setIntegers.find(1);
//    if(iElementFound != setIntegers.end())
//    {
//        cout<<*iElementFound<<endl;
//    }
//    else
//    {
//        cout<<"not found"<<endl;
//    }

//}


//删除指定的元素
//19.4
//#include<set>
//#include<iostream>

//using namespace std;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement !=Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//}

//typedef multiset <int> MSETINT;

//int main()
//{
//    MSETINT msetIntegers;
//    msetIntegers.insert(43);
//    msetIntegers.insert(78);
//    msetIntegers.insert(-1);
//    msetIntegers.insert(124);

//    cout<<"multiset contains "<<msetIntegers.size()<<" elements.";
//    cout<<"There are ";

//    DisplayContents(msetIntegers);
//    cout<<endl;
//    msetIntegers.erase(124);//删除指定的元素

//    cout<<"multiset contains "<<msetIntegers.size()<<" elements.";
//    cout<<"There are ";

//    DisplayContents(msetIntegers);

//}



////19.5
////使用find和erase的STL set
//#include<set>
//#include<iostream>
//#include<string.h>
//using namespace std;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }

//    cout<<endl;
//}

//struct ContactItem
//{
//    string strContactName;
//    string strPhoneNumber;
//    string strDisplayRepresentation;

//    ContactItem(const string& strName,const string& strNumber)
//    {
//        strContactName = strName;
//        strPhoneNumber = strNumber;
//        strDisplayRepresentation = (strContactName+' '+strPhoneNumber);
//    }

//    bool operator == (const ContactItem& itemToCompare) const
//    {
//        return (itemToCompare.strContactName == this->strContactName);
//    }

//    bool operator < (const ContactItem& itemToCompare) const
//    {
//        return (this->strContactName< itemToCompare.strContactName);
//    }
//    //used in DisplayContents()
//    operator const char*() const
//    {
//        return strDisplayRepresentation.c_str();
//    }
//};
//int main()
//{
//    set<ContactItem> setContacts;
//    setContacts.insert(ContactItem("Jack","+110"));
//    setContacts.insert(ContactItem("Bill","+120"));
//    setContacts.insert(ContactItem("Angle","+130"));
//    setContacts.insert(ContactItem("Barack","+140"));
//    DisplayContents(setContacts);//上面有讲

//    string NameInput = "Jac";
//    auto iContactFound = setContacts.find(ContactItem(NameInput,""));
//    if(iContactFound != setContacts.end())
//    {
//        setContacts.erase(iContactFound);
//        DisplayContents(setContacts);
//    }
//    else
//    {
//        cout<<"Contact not found"<<endl;
//    }
//    return 0;


//}

//19.6
//unorderedset的用法
//#include<unordered_set>
//#include<set>
//#include<iostream>
//using namespace std;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    cout<<"Number of elements,size() = "<<Input.size()<<endl;
//    cout<<"Max bucket count = "<<Input.max_bucket_count()<<endl;
//    cout<<"Load factor: "<<Input.load_factor()<<endl;
//    cout<<"Max load factor: "<<Input.max_load_factor()<<endl;
//    cout<<"Undered set contains"<<endl;
//    for(auto iElement = Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//}

//int main()
//{
//    unordered_set<int> usetInt;
//    usetInt.insert(10);
//    usetInt.insert(5);
//    usetInt.insert(1);
//    usetInt.insert(12);
//    usetInt.insert(1222);
//    usetInt.insert(1222222);
//    usetInt.insert(1222334);

//    DisplayContents(usetInt);
//    usetInt.insert(111111);
//    DisplayContents(usetInt);
//    cout<<endl;
//    auto iPairThousand =usetInt.find(1222);
//    if(iPairThousand != usetInt.cend())
//    {
//        cout<<*iPairThousand<<endl;
//    }
//    else
//    {
//        cout<<"Not found"<<endl;
//    }
//}


//////19.6.2   练习  -2
///// /
//#include<set>
//#include<iostream>
//#include<string>
//#include<string.h>

//using namespace std;
//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement = Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//struct PAIR_WORD_MEANING
//{
//    string strWorld;
//    string strMeaning;
//    string strDisplayRepresentation;
//    PAIR_WORD_MEANING(const string& sWord,const string& sMeaning):strWorld(sWord),strMeaning(sMeaning),strDisplayRepresentation(sWord+" "+sMeaning){}

//    bool operator < (const PAIR_WORD_MEANING& pairAnotherWord) const
//    {
//        return (strWorld<pairAnotherWord.strWorld);
//    }

//    operator const char*() const
//    {
//        return strDisplayRepresentation.c_str();
//    }
//};

//int main()
//{
//    multiset<PAIR_WORD_MEANING> msetDictionary;
//    PAIR_WORD_MEANING word1("C++","A programming language");
//    PAIR_WORD_MEANING word2("Programmer","A geek!");

//    msetDictionary.insert(word1);
//    msetDictionary.insert(word2);
//    DisplayContents(msetDictionary);
//}

////19.6.2   练习  -3
////set 只接受一个相同的数,multiset可接受多个相同的数
//#include<set>
//#include<iostream>

//using namespace std;

//template <typename T>
//void DisplayContent(const T& sequence)
//{
//    for(auto iElement = sequence.cbegin();iElement != sequence.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//}

//int main()
//{
//    multiset<int> msetIntegers;
//    msetIntegers.insert(11);
//    msetIntegers.insert(11);
//    msetIntegers.insert(11);
//    msetIntegers.insert(11);

//    set<int> setIntegers;
//    setIntegers.insert(11);
//    setIntegers.insert(11);
//    setIntegers.insert(11);
//    setIntegers.insert(11);

//    DisplayContent(msetIntegers);
//    cout<<endl;
//    DisplayContent(setIntegers);


//}

////20.1
////实例化STL map和multimap(键类型为int,值类型为string)
//#include<map>
//#include<iostream>
//#include<string>

//template<typename KeyType>
//struct ReverseSort
//{
//    bool operator() (const KeyType& key1,const KeyType& key2)
//    {
//        return(key1 >key2);
//    }
//};

//int main()
//{
//    using namespace std;

//    map<int,string> mapIntToString1;
//    multimap<int,string> mmapIntToString1;

//    map<int,string> mapIntToString2(mapIntToString1);
//    multimap<int,string> mmapIntToString2(mmapIntToString1);

//    map<int,string> mapIntToString3(mapIntToString1.cbegin(),mapIntToString1.cend());
//    multimap<int,string> mmapIntToString3(mmapIntToString1.cbegin(),mmapIntToString1.cend());

//    map<int,string,ReverseSort<int>> mapIntToString4(mapIntToString1.cbegin(),mapIntToString1.cend());
//    multimap<int,string,ReverseSort<int>> mmapIntToString4(mmapIntToString1.cbegin(),mmapIntToString1.cend());

//}



////20.2
//使用insert以及数组语法(运算符[]) 在STL map和multimap中插入元素
//#include<map>
//#include<iostream>
//#include<string>
//using namespace std;

//typedef map <int,string> MAP_INT_STRING;
//typedef multimap <int,string> MMAP_INT_STRING;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<iElement->first<<" -> "<<iElement->second<<endl;
//    }

//    cout<<endl;
//}

//int main()
//{
//    MAP_INT_STRING mapIntToString;
//    //不同的表达方式
//    mapIntToString.insert(MAP_INT_STRING::value_type(3,"Three"));

//    mapIntToString.insert(make_pair(-1,"Minus One"));

//    mapIntToString.insert(pair<int,string>(1000,"One Thousand"));

//    mapIntToString [100000] = "One Million";

//    cout<<"The map contains"<<mapIntToString.size();
//    cout<<"key-value pairs. They are: "<<endl;
//    DisplayContents(mapIntToString);


//    MMAP_INT_STRING mmapIntToString(mapIntToString.cbegin(),mapIntToString.cend());
//    mmapIntToString.insert(make_pair(1000,"Thousand"));

//    cout<<endl<<"The multimap contains "<<mmapIntToString.size();
//    cout<<"key-value pairs.They are: "<<endl;
//    DisplayContents(mmapIntToString);
//    //1000包含的数量
//    cout<<"The number of pairs int the multimap with 1000 as their key:"<<mmapIntToString.count(1000)<<endl;
//}


//20.3
////使用成员函数find在map中查找键-值对
//#include<map>
//#include<iostream>
//#include<string>
//using namespace std;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement = Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<iElement->first<<" -> "<<iElement->second<<endl;
//    }
//    cout<<endl;
//}

//int main()
//{
//    map<int,string> mapIntToString;
//    mapIntToString.insert(make_pair(3,"Three"));
//    mapIntToString.insert(make_pair(45,"Forty Five"));
//    mapIntToString.insert(make_pair(-1,"Minus One"));
//    mapIntToString.insert(make_pair(1000,"Thousand"));

//    cout<<"The multimap contains "<<mapIntToString.size();
//    cout<<"key-value pairs.They are : "<<endl;

//    DisplayContents(mapIntToString);
//    //find的是具体的数值
//    auto iPairFound = mapIntToString.find(1000);
//    if(iPairFound != mapIntToString.cend())
//    {
//        cout<<"Key"<<iPairFound->first<<"points to Value: ";
//        cout<<iPairFound->second<<endl;
//    }
//    else
//    {
//        cout<<"Not found"<<endl;
//    }

//}

////20.4
////删除multimap中的元素
//#include<map>
//#include<iostream>
//#include<string>
//using namespace std;

//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement = Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<iElement->first<<"->"<<iElement->second<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    multimap<int,string> mmapIntToString;

//    mmapIntToString.insert(make_pair(3,"Three"));
//    mmapIntToString.insert(make_pair(45,"Forty Five"));
//    mmapIntToString.insert(make_pair(-1,"Minus One"));
//    mmapIntToString.insert(make_pair(1000,"Thousand"));

//    //增加冗余的东西
//    mmapIntToString.insert(make_pair(-1,"Minus One"));
//    mmapIntToString.insert(make_pair(1000,"Thousand"));

//    DisplayContents(mmapIntToString);
//    //返回的是数量
//    auto NumPairsErased = mmapIntToString.erase(3);
//    cout<<NumPairsErased<<endl;

//    auto iPairLocator = mmapIntToString.find(45);
//    if(iPairLocator != mmapIntToString.cend())
//    {
//        mmapIntToString.erase(iPairLocator);
//    }
//    DisplayContents(mmapIntToString);

//    mmapIntToString.erase(mmapIntToString.lower_bound(-1),mmapIntToString.upper_bound(1000));
//    DisplayContents(mmapIntToString);


//}
//20.5
//自定义排序谓语

//#include<map>
//#include<algorithm>
//#include<string>
//#include<iostream>
//using namespace std;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement = Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<iElement->first<<" -> "<<iElement->second<<endl;
//    }
//}
////????
//////编译器的问题
//struct PreIgnoreCase
//{
//    bool operator()(const string& str1,const string& str2) const
//    {
//        string str1NoCase(str1),str2NoCase(str2);
//        std::transform(str1.begin(),str1.end(),str1NoCase.begin(),toupper);
//        std::transform(str2.begin(),str2.end(),str2NoCase.begin(),toupper);

//        return(str1NoCase < str2NoCase);
//    }
//};

//typedef map<string,string> DIRECTORY_WITHCASE;
////typedef map<string,string,PreIgnoreCase> DIRECTORY_NOCASE;

//int main()
//{
////    DIRECTORY_WITHCASE dirCaseSensitive;
////    dirCaseSensitive.insert(make_pair("John","232222222"));
////    dirCaseSensitive.insert(make_pair("JOHN","232222222"));
////    dirCaseSensitive.insert(make_pair("Sara","123456879"));
////    dirCaseSensitive.insert(make_pair("Jack","222224522"));

////    DisplayContents(dirCaseSensitive);

////    auto iPairInCaseSensDir = dirCaseSensitive.find("JHN");
////    if(iPairInCaseSensDir != dirCaseSensitive.end())
////    {
////        cout<<iPairInCaseSensDir->first<<"---"<<iPairInCaseSensDir->second<<endl;
////    }
////    else
////    {
////        cout<<"Not Found"<<endl;
////    }

//}

//20.6
////实例化STL散列表实现unordered_map
//#include<iostream>
//#include<string>
//#include<unordered_map>
//using namespace std;

//template <typename T1,typename T2>
//void DisplayUnorderedMap(unordered_map<T1,T2>& Input)
//{
//    cout<<"Number of pairs,size(): "<<Input.size()<<endl;
//    cout<<"Max bucket count = "<<Input.max_bucket_count()<<endl;
//    cout<<"Load factor: "<<Input.load_factor()<<endl;
//    cout<<"Max load factor= "<<Input.max_load_factor()<<endl;
//    for(auto iElement = Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<iElement->first<<"->"<<iElement->second<<" ";
//    }
//}

//int main()
//{
//    unordered_map<int,string> umapIntToString;
//    umapIntToString.insert(make_pair(1,"One"));
//    umapIntToString.insert(make_pair(45,"Forty Five"));
//    umapIntToString.insert(make_pair(1001,"Thousand one"));

////    DisplayUnorderedMap(umapIntToString);


//    umapIntToString.insert(make_pair(11111,"Thousand one one one"));
////    DisplayUnorderedMap(umapIntToString);

//    auto iElementFound = umapIntToString.find(45);
//    if(iElementFound != umapIntToString.end())
//    {
//        cout<<"Found Key"<<iElementFound->first<<"points to value";
//        cout<<iElementFound->second<<endl;
//    }
//    else
//    {
//        cout<<"Not Found"<<endl;
//    }

//}

////21.1
////使用一元函数将集合的内容显示在屏幕上
//#include<algorithm>
//#include<iostream>
//#include<vector>
//#include<list>


//using namespace std;

//template <typename elementType>
//struct DisplayElement
//{
//    void operator()(const elementType& element) const
//    {
//        cout<<element<<" ";
//    }
//};

//int main()
//{
//    vector<int> vecIntegers;
//    for(int nCount = 0;nCount <10;++nCount)
//    {
//        vecIntegers.push_back(nCount);
//    }

//    list<char> listChars;

//    for(char nChar ='a';nChar<'k';++nChar)
//    {
//        listChars.push_back(nChar);
//    }

//    for_each(vecIntegers.begin(),vecIntegers.end(),DisplayElement<int>());
//    cout<<endl;

//    cout<<"Display the list of characters:"<<endl;
//    for_each(listChars.begin(),listChars.end(),DisplayElement<char>());

//}

////21.2
////使用函数对象存储状态
//#include<algorithm>
//#include<iostream>
//#include<vector>
//using namespace std;

//template<typename elementType>
//struct DisplayElementKeepCount
//{
//    int Count;

//    DisplayElementKeepCount():Count(0){}

//    void operator()(const elementType& element)
//    {
//        ++Count;
//        cout<<element<<' ';
//    }
//};

//int main()
//{
//    vector<int> vecIntegers;
//    for(int nCount =0; nCount <10;++nCount)
//    {
//        vecIntegers.push_back(nCount);
//    }
//    DisplayElementKeepCount<int> Result;
//    Result = for_each(vecIntegers.begin(),vecIntegers.end(),DisplayElementKeepCount<int> ());
//    cout<<endl;

//    cout<<Result.Count<<endl;

//}

////21.4
////返回能被指定的除数整除
//#include<algorithm>
//#include<vector>
//#include<iostream>
//using namespace std;

//template <typename numberType>
//struct IsMultiple
//{
//    numberType Divisor;

//    IsMultiple(const numberType& divisor)
//    {
//        Divisor = divisor;
//    }

//    bool operator ()(const numberType& element) const
//    {
//        return ((element%Divisor) == 0);
//    }
//};


//int main()
//{
//    vector<int> vecIntegers;
//    for(int nCount= 29;nCount <32;++nCount)
//    {
//        vecIntegers.push_back(nCount);
//        cout<<nCount<<' ';
//    }
//    //除数
//    int Divisor =2;

//    auto iElement = find_if(vecIntegers.begin(),vecIntegers.end(),IsMultiple<int>(Divisor));

//    if(iElement != vecIntegers.end())
//    {
//        cout<<"First element in vector divisor by"<<Divisor;
//        cout<<" : "<<*iElement<<endl;
//    }


//}


////21.5
////使用二元函数将两个范围相乘
//#include<vector>
//#include<iostream>
//#include<algorithm>

//template <typename elementType>
//class Multiply
//{
//public:
//    elementType operator ()(const elementType& elem1,const elementType& elem2)
//    {
//        return (elem1*elem2);
//    };
//};

//int main()
//{
//    using namespace std;
//    vector<int> vecMultiplicand,vecMultiplier;

//    for(int nCount1 = 0;nCount1 <10;++nCount1)
//    {
//        vecMultiplicand.push_back(nCount1);
//    }

//    for(int nCount2= 100;nCount2 <110;++nCount2 )
//    {
//        vecMultiplier.push_back(nCount2);
//    }

//    vector<int> vecResult;

//    vecResult.resize(10);
//    transform(vecMultiplicand.begin(),vecMultiplicand.end(),vecMultiplier.begin(),vecResult.begin(),Multiply <int>() );
//    for(size_t nIndex1 = 0;nIndex1<vecMultiplicand.size();++nIndex1)
//    {
//        cout<<vecMultiplicand[nIndex1]<<" ";
//    }
//    cout<<endl;
//    for(size_t nIndex2 = 0;nIndex2<vecMultiplier.size();++nIndex2)
//    {
//        cout<<vecMultiplier[nIndex2]<<" ";
//    }
//    cout<<endl;
//    for(size_t nIndex =0;nIndex <vecResult.size();nIndex++)
//    {
//        cout<<vecResult[nIndex]<<" ";
//    }
//}

////21.7
//#include<vector>
//#include<algorithm>
//#include<iostream>
//using namespace std;
//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement= Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<endl;
//    }
//}

//int main()
//{
//    vector<string> vecNames;
//    vecNames.push_back("Jim");
//    vecNames.push_back("Tom");
//    vecNames.push_back("Adam");
//    vecNames.push_back("Sam");
//    DisplayContents(vecNames);
//    cout<<endl;
//    sort(vecNames.begin(),vecNames.end());
//    DisplayContents(vecNames);

//}

//////21.5.2   -1
/////
//#include<vector>
//#include<iostream>
//#include<algorithm>

//using namespace std;

//template <typename elementType>
//struct DisplayElement
//{
//    void operator ()(const elementType& element)
//    {
//        cout<<element*2<<endl;
//    }
//};
//int main()
//{
//    vector<int> vecIntegers;
//    for(int nCount=0;nCount<10;++nCount)
//    {
//        vecIntegers.push_back(nCount);
//    }

//    for_each(vecIntegers.cbegin(),vecIntegers.cend(),DisplayElement<int>());
//}



////21.5.2  -2
//////

//#include<vector>
//#include<iostream>
//#include<algorithm>

//using namespace std;

//template <typename elementType>
//struct DisplayElement
//{
//    int Count;
//    DisplayElement():Count(0){}
//    void operator ()(const elementType& element)
//    {
//        ++Count;
//        cout<<element*2<<endl;
//    }
//};
//int main()
//{
//    vector<int> vecIntegers;
//    for(int nCount=0;nCount<20;++nCount)
//    {
//        vecIntegers.push_back(nCount);
//    }

//    DisplayElement<int> Result;

//    Result = for_each(vecIntegers.cbegin(),vecIntegers.cend(),DisplayElement<int>());
//    cout<<endl;

//    cout<<Result.Count<<endl;
//}

////22.1
////在算法for_each()中使用lambda表达式而不是函数对象来显示容器中的内容
//#include<iostream>
//#include<algorithm>
//#include<vector>
//#include<list>

//using namespace std;

//int main()
//{
//    vector<int> vecIntegers;

//    for(int nCount=0;nCount<10;++nCount)
//    {
//        vecIntegers.push_back(nCount);
//    }

//    list<char> listChars;
//    for(char nChar = 'a';nChar <'k';++nChar)
//    {
//        listChars.push_back(nChar);
//    }

//    for_each(vecIntegers.begin(),vecIntegers.end(),[](int& element){cout<<element<<" ";}  );//lambda
//    cout<<endl;

//    for_each(listChars.begin(),listChars.end(),[](char& element){cout<<element<<" ";});//lambda

//}






////22.2
////查找集合中的第一个偶数
////一元谓词对应的lambda表达式
//#include<algorithm>
//#include<vector>
//#include<iostream>
//using namespace std;

//int main()
//{
//    vector<int> vecNums;

//    vecNums.push_back(11);
//    vecNums.push_back(111);
//    vecNums.push_back(12334);
//    vecNums.push_back(12);

//    auto iEvenNum =find_if(vecNums.begin(),vecNums.end(),[](const int& Num){return ((Num%2)==0);});
//    if(iEvenNum != vecNums.end())
//    {
//        cout<<*iEvenNum<<endl;
//    }
//}



////22.3
////
//#include<algorithm>
//#include<vector>
//#include<iostream>

//using namespace std;

//int main()
//{
//    vector<int> vecIntegers;

//    for(int nCount=25;nCount <=32;++nCount)
//    {
//        vecIntegers.push_back(nCount);
//        cout<<nCount<<" ";
//    }

//    int Divisor = 16;

//    vector<int>::iterator iElement;
//    //什么格式呢
//    iElement =find_if(vecIntegers.begin(),vecIntegers.end(),[Divisor](int dividend){return (dividend%Divisor)==0;});
//    if(iElement != vecIntegers.end())
//    {
//        cout<<Divisor<<" : "<<*iElement<<endl;
//    }
//    return 0;
//}


////22.4
////二元函数对应的lambda表达式
//#include<iostream>
//#include<vector>
//#include<algorithm>

//int main()
//{
//    using namespace std;

//    vector<int> vecMultiplicand,vecMultiplier;

//    for(int nCount1 =0;nCount1 <10;++nCount1)
//    {
//        vecMultiplicand.push_back(nCount1);
//    }

//    for(int nCount2 = 100;nCount2< 109;++nCount2)
//    {
//        vecMultiplier.push_back(nCount2);
//    }

//    vector<int> vecResult;

//    //分配向量的大小
//    vecResult.resize(10);

//    //前两个数是范围,第3个数是,第4个数是保存的结果,第5个是lambda表达式
//    transform(vecMultiplicand.begin(),vecMultiplicand.end(),vecMultiplier.begin(),vecResult.begin(),[](int a,int b){return (a*b);});
//    for(size_t nIndex1 =0;nIndex1 <vecMultiplicand.size();++nIndex1)
//    {
//        cout<<vecMultiplicand[nIndex1]<<" ";
//    }
//    cout<<endl;
//    for(size_t nIndex2= 0;nIndex2<vecMultiplier.size();++nIndex2)
//    {
//        cout<<vecMultiplier[nIndex2]<<" ";
//    }
//    cout<<endl;
//    for(size_t nIndex3 =0;nIndex3 <vecResult.size();++nIndex3)
//    {
//        cout<<vecResult[nIndex3]<<" ";
//    }
//}

////22.5
////二元谓词
//#include<iostream>
//#include<string>
//#include<vector>
//#include<algorithm>

//using namespace std;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.cbegin();iElement != Input.cend();++iElement )
//    {
//        cout<<*iElement<<" ";
//    }
//}

//int main()
//{
//    vector<string> vecNames;

//    vecNames.push_back("aaa");
//    vecNames.push_back("zzz");
//    vecNames.push_back("bbb");
//    vecNames.push_back("ccc");
//    DisplayContents(vecNames);

//    cout<<endl;
////    sort(vecNames.begin(),vecNames.end());
////    DisplayContents(vecNames);
//    //转换成小写,然后进行比较
//    //因为有tolower 编译不成功
////    sort(vecNames.begin(),vecNames.end(),
////         [](const string& str1,const string& str2) ->bool
////         {
////          string str1LowerCase;
////          str1LowerCase.resize(str1.size());

////          transform(str1.begin(),str1.end(),str1LowerCase.begin(),tolower);
////          string str2LowerCase;
////          str2LowerCase.resize(str2.size());
////          transform(str2.begin(),str2.end(),str2LowerCase.begin(),tolower);

////          return(str1LowerCase <str2LowerCase);
////         }
////         );
//    //22.11.2  -1
//    sort(vecNames.begin(),vecNames.end(),
//         [](const string& str1,const string& str2)
//         {
//            return(str1>str2);
//         }
//    );
//    DisplayContents(vecNames);
//}

////22.11.2  -2
////一元函数
//#include<algorithm>
//#include<iostream>
//#include<vector>
//#include<iostream>
//using namespace std;
//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.begin();iElement != Input.end();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//}
//int main()
//{
//    vector<int> vecIntegers;
//    for(int nCount =1;nCount <=10;nCount++)
//    {
//        vecIntegers.push_back(nCount);
//    }
//    DisplayContents(vecIntegers);
//    int AddNum =2;
//    cout<<endl;
//    //Num是一个临时变量
//    for_each(vecIntegers.begin(),vecIntegers.end(),[AddNum](int Num){cout<<(Num+=AddNum)<<" ";});
////    DisplayContents(vecIntegers);

//}

////23.1
////使用find() 在vector中查找元素,并使用find_if以及用一个用lambda表达式表示的一元谓词查找第一个偶数

//#include<iostream>
//#include<algorithm>
//#include<vector>

//int main()
//{
//    using namespace std;

//    vector<int> vecIntegers;

//    for(int SampleValue =-9;SampleValue <10;++SampleValue)
//    {
//        vecIntegers.push_back(SampleValue);
//    }
//    int NumToFound =2;
//    auto iElementFound = find(vecIntegers.begin(),vecIntegers.end(),NumToFound);
//    if(iElementFound != vecIntegers.end())
//    {
//        cout<<*iElementFound<<endl;
//    }
//    else
//    {
//        cout<<"Not Found"<<endl;
//    }

//    auto iEvenNumber = find_if(vecIntegers.begin(),vecIntegers.end(),[](int element){return (element%2)==0;});

//    if(iEvenNumber != vecIntegers.end())
//    {
//        cout<<*iEvenNumber<<endl;
////        cout<<"distance"<<distance(vecIntegers.begin(),iEvenNumber);
//    }

//}

//23.2
//#include<algorithm>
//#include<vector>
//#include<iostream>

//template <typename elementType>
//bool IsEven(const elementType& number)
//{
//    return ((number%2)==0);
//}

//int main()
//{
//    using namespace std;
//    vector<int> vecIntegers;
//    for(int nNum=-9;nNum<10;nNum++)
//    {
//        vecIntegers.push_back(nNum);
//    }

//    size_t nNumZeros =count(vecIntegers.begin(),vecIntegers.end(),0);
//    cout<<nNumZeros<<endl;

//    size_t nNumEvenElements = count_if(vecIntegers.begin(),vecIntegers.end(),IsEven<int>);
//    cout<<nNumEvenElements<<endl;
//}

////23.3
////查找后一个序列在前一个序列中的位置
//#include<algorithm>
//#include<vector>
//#include<list>
//#include<iostream>
//using namespace std;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.begin();iElement != Input.end();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//}

//int main()
//{
//    vector<int> vecIntegers;
//    for(int nNum =-9;nNum<10;nNum++)
//    {
//        vecIntegers.push_back(nNum);
//    }

//    vecIntegers.push_back(9);
//    vecIntegers.push_back(9);

//    list<int> listIntegers;
//    for(int nNum=-4;nNum<5;nNum++)
//    {
//        listIntegers.push_back(nNum);
//    }

//    DisplayContents(vecIntegers);
//    cout<<endl;
//    DisplayContents(listIntegers);
//    //查找序列,后一个序列在前一个序列中的位置
//    auto iRange =search(vecIntegers.begin(),vecIntegers.end(),listIntegers.begin(),listIntegers.end());
//    cout<<endl;
//    if(iRange != vecIntegers.end())
//    {
//        cout<<"distance1 :"<<distance(vecIntegers.begin(),iRange);
//    }
//    //3个9在前一个序列中的位置
//    auto iPartialRange =search_n(vecIntegers.begin(),vecIntegers.end(),3,9);
//    cout<<endl;
//    if(iPartialRange !=vecIntegers.end())
//    {
//        cout<<"distance: "<<distance(vecIntegers.begin(),iPartialRange);
//    }
//}

////23.4
//在向量中填充3个9
//#include<iostream>
//#include<vector>
//#include<iostream>

//int main()
//{
//    using namespace std;
//    vector<int> vecIntegers(3);
//    fill(vecIntegers.begin(),vecIntegers.end(),9);
//    //
//    vecIntegers.resize(6);
//    //第一个参数是开始位置,加入3个9
//    fill_n(vecIntegers.begin()+3,3,-9);

//    for(size_t nIndex =0;nIndex <vecIntegers.size();++nIndex)
//    {
//        cout<<vecIntegers[nIndex]<<" ";
//    }

//}

////23.5
//在指定的位置产生随机数
//generate_n是在指定的位置产生n个随机数
//#include<iostream>
//#include<vector>
//#include<algorithm>
//#include<list>

//int main()
//{
//    using namespace std;

//    vector<int> vecIntegers(10);
//    generate(vecIntegers.begin(),vecIntegers.end(),rand);
//    for(size_t nCount=0;nCount<10;nCount++)
//    {
//        cout<<vecIntegers[nCount]<<" ";
//    }
//    cout<<endl;

//    list<int> listIntegers(10);
//    //在第一个参数的位置产生5个随机数
//    //cbegin是const begin的缩写
//    generate_n(listIntegers.begin(),5,rand);

//    list<int>::const_iterator iElementLocator;
//    for( iElementLocator = listIntegers.begin();iElementLocator != listIntegers.end();++iElementLocator)
//    {
//        cout<<*iElementLocator<<" ";
//    }
//}

////22.6
//#include<iostream>
//#include<algorithm>
//#include<vector>
//#include<string>

//using namespace std;

//template <typename elementType>
//struct DisplayElementKeepCount
//{
//    int Count;
//    DisplayElementKeepCount():Count(0){}
//    void operator ()(const elementType& element)
//    {
//        ++Count;
//        cout<<element<<" ";
//    }
//};


//int main()
//{
//    vector<int> vecIntegers;
//    for(int nCount=0;nCount<10;nCount++)
//    {
//        vecIntegers.push_back(nCount);
//    }

//    DisplayElementKeepCount<int> Functor =
//       for_each(vecIntegers.begin(),vecIntegers.end(),DisplayElementKeepCount<int>());
//    cout<<endl;

//    cout<<Functor.Count<<endl;

//    string Sample("for_each and strings");
//    int NumChars = 0;
//    //P335 务必加强联系感
//    for_each(Sample.begin(),Sample.end(),[&NumChars](char c)mutable{cout<<c<<" ";++NumChars;});
//    cout<<NumChars<<endl;

//}

////23.7
//两个数相加
//#include<iostream>
//#include<string>
//#include<vector>
//#include<deque>
//#include<iostream>
//#include<functional>
//#include<algorithm>

//int main()
//{
//    using namespace std;
//    string Sample("This is a TEst string!");
//    cout<<Sample<<endl;

//    //string strLowerCaseCopy;
//    //strLowerCaseCopy.resize(Sample.size());
//    //qt不好用tolower
//    //transform(Sample.begin(),Sample.end(),strLowerCaseCopy.begin(),tolower);
////    cout<<strLowerCaseCopy<<endl;
//    vector<int> vecIntegers1,vecIntegers2;
//    for(int nNum =0;nNum <10;++nNum)
//    {
//        vecIntegers1.push_back(nNum);
//        vecIntegers2.push_back(10-nNum);
//    }
//    deque<int> dqResultAddition(vecIntegers1.size());
//    //??
//    transform(vecIntegers1.begin(),vecIntegers1.end(),vecIntegers2.begin(),dqResultAddition.begin(),plus<int>());

//    for(size_t nIndex = 0;nIndex <vecIntegers1.size();++nIndex)
//    {
//        cout<<nIndex<<"  \t "<<vecIntegers1[nIndex]<<" \t+ ";
//        cout<<vecIntegers2[nIndex]<<" \t = ";

//        cout<<dqResultAddition[nIndex]<<endl;
//    }
//    return 0;
//}

////23.8
////remove移除指定的元素并且返回最后一个指定元素的下一个元素的位置
//#include<iostream>
//#include<algorithm>
//#include<vector>
//#include<list>

//using namespace std;

//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement = Input.cbegin();iElement != Input.cend();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//}

//int main()
//{
//    list<int> listIntegers;
//    for(int nCount=0;nCount<10;++nCount)
//    {
//        listIntegers.push_back(nCount);
//    }

//    DisplayContents(listIntegers);
//    cout<<endl;
//    vector<int> vecIntegers(listIntegers.size()*2);
//    //
//    auto iLastPos =copy(listIntegers.begin(),listIntegers.end(),vecIntegers.begin());
//    cout<<endl<<"A"<<endl;
//    DisplayContents(vecIntegers);
//    cout<<endl;
//    copy_if(listIntegers.begin(),listIntegers.end(),iLastPos,[](int element){return ((element%2) ==1);});

//    DisplayContents(vecIntegers);
//    cout<<endl;
//    //remove都是0的元素
//    //qt编译器有问题?x你理解问题啊
//    //remove很诡异啊
//    //remove
//    //返回的是:
//    auto iNewEnd =remove(vecIntegers.begin(),vecIntegers.end(),9);
////    cout<<endl;
////    cout<<"fd"<<endl;
////    DisplayContents(vecIntegers);
////    cout<<endl;
////    cout<<distance(vecIntegers.begin(),iNewEnd)<<endl;
////    //erase的是一个区间的元素
//    vecIntegers.erase(iNewEnd,vecIntegers.end());
//    cout<<"remove 0"<<endl;
//    DisplayContents(vecIntegers);
////    cout<<endl;
////    iNewEnd =remove_if(vecIntegers.begin(),vecIntegers.end(),[](int element){return((element%2)==1);});
//    //???
////    vecIntegers.erase(iNewEnd,vecIntegers.end());
////    DisplayContents(vecIntegers);
//}
//////换VS编译器

////23.9
//#include<iostream>
//#include<algorithm>
//#include<vector>
//using namespace std;
//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.begin();iElement != Input.end();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    vector<int> vecIntegers(6);
//    //开始为开始位置,重点为起始位置,那不是1个吗????y应该是不包括
//    fill(vecIntegers.begin(),vecIntegers.begin()+1,8);
//    fill_n(vecIntegers.begin()+3,3,5);
//    DisplayContents(vecIntegers);
//    //随意洗牌
//    random_shuffle(vecIntegers.begin(),vecIntegers.end());
//    DisplayContents(vecIntegers);
//    //end的位置是不包括的啊xxxxxxx
//    //????输出什么回事啊
//    //将所有的元素中为5的改成8
//    replace(vecIntegers.begin(),vecIntegers.end(),5,9);
//    DisplayContents(vecIntegers);
//    replace_if(vecIntegers.begin(),vecIntegers.end(),[](int element){return((element%2)==0);},-1);
//    DisplayContents(vecIntegers);

//}


//////23.10
//#include<iostream>
//#include<vector>
//#include<string>
//#include<iostream>
//#include<algorithm>

//using namespace std;
//template <typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.begin();iElement != Input.end();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    vector<string> vecNames;
//    vecNames.push_back("John Doe");
//    vecNames.push_back("Jack NOO");
//    vecNames.push_back("Sean Penn");
//    vecNames.push_back("Anna Hoover");

//    vecNames.push_back("Jack NOO");

//    DisplayContents(vecNames);

//    sort(vecNames.begin(),vecNames.end());
//    DisplayContents(vecNames);
//    //binary_search() 只用于排序后的容器  把sort函数屏蔽就行,就能检验
//    bool bElementFound= binary_search(vecNames.begin(),vecNames.end(),"John Doe");
//    if(bElementFound)
//    {
//        cout<<"Found";
//    }
//    else
//    {
//        cout<<"Not Found";
//    }
//    cout<<endl;
//    //unique功能:对有序的容器重新排列,将第一次出现的元素从前往后排,其他重复的元素依次排在后面,
//    //返回值:返回迭代器,迭代器指向的是重复元素的首地址
//    auto iNewEnd = unique(vecNames.begin(),vecNames.end());
//    vecNames.erase(iNewEnd,vecNames.end());
//    cout<<distance(iNewEnd,vecNames.end());
//    DisplayContents(vecNames);
//}

////23.11
//#include<iostream>
//#include<vector>
//#include<algorithm>

//bool IsEven(const int& nNumber)
//{
//    return ((nNumber%2)==0);
//}

//using namespace std;
//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.begin();iElement != Input.end();iElement++)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    vector<int> vecIntegers;
//    for(int nNum =0;nNum<10;nNum++)
//    {
//        vecIntegers.push_back(nNum);
//    }
//    DisplayContents(vecIntegers);
//    vector<int> vecCopy(vecIntegers);
//    //偶数和奇数分成两块
//    partition(vecIntegers.begin(),vecIntegers.end(),IsEven);
//    DisplayContents(vecIntegers);
//    //相对位置不变
//    stable_partition(vecCopy.begin(),vecCopy.end(),IsEven);
//    DisplayContents(vecCopy);
//}

////23.12
//#include<algorithm>
//#include<list>
//#include<string>
//#include<iostream>
//using namespace std;

//template <typename T>
//void DisplayContens(const T& Input)
//{
//    for(auto iElement =Input.begin();iElement != Input.end();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    list<string> listName;
//    listName.push_back("John Doe");
//    listName.push_back("John Aaa");
//    listName.push_back("Brand Pitt");
//    listName.push_back("Sean Dddd");
//    listName.push_back("Anna Howww");
//    listName.push_back("VVVVV Howww");

//    listName.sort();
//    DisplayContens(listName);

//    //??
//    auto iMinInsertPos =lower_bound(listName.begin(),listName.end(),"Brad Pitt");
//    cout<<distance(listName.begin(),iMinInsertPos);
//    cout<<endl;
//    //??
//    auto iMaxInsertPos =upper_bound(listName.begin(),listName.end(),"VVVVV Howww");
//    cout<<distance(listName.begin(),iMaxInsertPos);
//    cout<<endl;

//    listName.insert(iMaxInsertPos,"Brad Pitt");
//    DisplayContens(listName);
//}

//23.6.2  -2
//向量必须初始化大小吗
//#include<iostream>
//#include<list>
//#include<vector>
//#include<algorithm>

//using namespace std;
//template<typename T>
//void DisplayContents(const T& Input)
//{
//    for(auto iElement =Input.begin();iElement != Input.end();++iElement)
//    {
//        cout<<*iElement<<" ";
//    }
//    cout<<endl;
//}

//int main()
//{
//    list<string> strNames1;
//    strNames1.push_back("Lisa");
//    strNames1.push_back("Mara");
//    strNames1.push_back("Jim");
      //向量必须初始化向量的大小吗
//    vector<string> vecNames(strNames1.size());
//    copy(strNames1.begin(),strNames1.end(),vecNames.begin());
//    DisplayContents(vecNames);
//}

////24.1
//实例化STL stack
//#include<stack>
//#include<vector>
//int main()
//{
//    using namespace std;

//    stack<int> stackInts;
//    stack<double> stackDoubles;
//    stack<double,vector<double>> stackDoubleIntVector;

//    stack<int> stackIntsCopy(stackInts);
//    return 0;
//}


////24.2
////使用整型stack
//#include<stack>
//#include<iostream>

//int main()
//{
//    using namespace std;

//    stack<int> stackInts;

//    stackInts.push(25);
//    stackInts.push(10);
//    stackInts.push(-1);
//    stackInts.push(5);

//    while(stackInts.size()!= 0)
//    {
//        cout<<stackInts.top()<<" ";
//        stackInts.pop();
//    }
//    if(stackInts.empty())
//    {
//        cout<<"OK"<<endl;
//    }
//}


////24.3
//实例化STL queue
//#include<queue>
//#include<list>

//int main()
//{
//    using namespace std;

//    queue<int> qIntegers;
//    queue<double> qDoubles;
//    queue<double,list<double>> qDoubleIntList;

//    queue<int> qCopy(qIntegers);
//    return 0;
//}



////24.4
//#include<queue>
//#include<iostream>

//int main()
//{
//    using namespace std;
//    queue<int> qIntegers;

//    qIntegers.push(10);
//    qIntegers.push(1);
//    qIntegers.push(12);
//    qIntegers.push(11);

//    cout<<qIntegers.size()<<endl;
//    cout<<qIntegers.front()<<endl;
//    cout<<qIntegers.back()<<endl;
//    while(qIntegers.size() != 0)
//    {
//        cout<<qIntegers.front()<<" ";
//        qIntegers.pop();
//    }
//    if(qIntegers.empty() != 0)
//    {
//        cout<<"Empty";
//    }

//}

////24.5

//#include<queue>
//int main()
//{
//    using namespace std;

//    priority_queue<int> pqIntegers;
//    priority_queue<double> pqDoubles;

//    priority_queue<int, deque<int>,greater<int>> pqIntegers_Inverse;

//    priority_queue<int> pqCopy(pqIntegers);
//    return 0;
//}

////24.6
//#include<queue>
//#include<iostream>
//int main()
//{
//    using namespace std;
//    priority_queue<int> pqIntegers;
//    pqIntegers.push(10);
//    pqIntegers.push(5);
//    pqIntegers.push(-1);
//    pqIntegers.push(20);

//    while(!pqIntegers.empty())
//    {
//        cout<<pqIntegers.top()<<" ";
//        pqIntegers.pop();
//    }
//}

////24.7
//#include<queue>
//#include<iostream>

//int main()
//{
//    using namespace std;

//    priority_queue<int,vector<int>,greater<int>> pqIntegers;
//    pqIntegers.push(10);
//    pqIntegers.push(5);
//    pqIntegers.push(-1);
//    pqIntegers.push(30);

//    cout<<pqIntegers.size()<<endl;
//    while(!pqIntegers.empty())
//    {
//        cout<<pqIntegers.top()<<" ";
//        pqIntegers.pop();
//    }
//}

////25.1

//#include<bitset>
//#include<iostream>
//#include<string>

//int main()
//{
//    using namespace std;

//    bitset<4> fourBits;
//    cout<<fourBits<<endl;
//    bitset<8> fiveBits("10101");
//    cout<<fiveBits<<endl;
//    bitset<8> eightbits(255);
//    cout<<eightbits<<endl;
//    bitset<8> eightBitsCopy(eightbits);

//}

////25.2
////操作位
//#include<iostream>
//#include<string>
//#include<bitset>

//int main()
//{
//    using namespace std;

//    bitset<8> inputBits(255);
//    cout<<inputBits.count()<<endl;
//    cout<<inputBits.size()<<endl;
//    bitset<8> inputFlipped(inputBits);
//    //flip  翻转
//    inputFlipped.flip();
//    cout<<inputFlipped<<endl;
//    cout<<(inputBits&inputFlipped)<<endl;
//    cout<<(inputBits|inputFlipped)<<endl;
//    cout<<(inputBits ^ inputFlipped)<<endl;

//}

////25.3
//#include<vector>
//int main()
//{
//    using namespace std;

//    vector<bool> vecBool1;
//    vector<bool> vecBool2(10,true);
//    vector<bool> vecBool2Copy(vecBool2);
//    return 0;
//}



////25.4
//#include<vector>
//#include<iostream>
//using namespace std;

//int main()
//{
//    vector<bool> vecBoolFlags(3);
//    vecBoolFlags[0] =true;
//    vecBoolFlags[1] =true;
//    vecBoolFlags[2] =false;
//    vecBoolFlags.push_back(true);
//    for(size_t nIndex =0;nIndex <vecBoolFlags.size();++nIndex)
//    {
//        cout<<vecBoolFlags[nIndex]<<" ";
//    }
//    cout<<endl;
//    //反转
//    vecBoolFlags.flip();
//    for(size_t nIndex =0;nIndex <vecBoolFlags.size();++nIndex)
//    {
//        cout<<vecBoolFlags[nIndex]<<" ";
//    }
//    cout<<endl;

//}

////两个bit相加
//#include<bitset>
//#include<iostream>

//int main()
//{
//    using namespace std;

//    bitset<4> inputBit1("1010");
//    cout<<inputBit1<<endl;
//    bitset<4> inputBit2("1011");
//    cout<<inputBit2<<endl;
//    //支持两个对象相加
//    bitset<4> addResult(inputBit1.to_ulong()+inputBit2.to_ulong());
//    cout<<addResult<<endl;
//    //按位反转
//    cout<<addResult.flip()<<endl;
//}


////26.1
////智能指针最基本的组成部分
////???
//template<typename T>
//class smart_pointer
//{
//private:
//    T* m_pRawPointer;
//public:
//    smart_pointer(T* pData): m_pRawPointer(pData){}
//    ~smart_pointer() {delete pData;};

//    //copy constructor
//    smart_pointer(const smart_pointer& anotherSP);
//    //???
//    //copy assignment operator
//    smart_pointer& operator=(const smart_pointer& anotherSP);
//    //解除操作符和成员选择操作符让这个类能够用作常规意义上的指针
//    //dereference operator  解除操作符
//    T& operator*() const
//    {
//        return *(m_pRawPointer);
//    }
//    //
//    //member selection operator
//    T* operator ->() const
//    {
//        return m_pRawPointer;
//    }
//};

////26.2
//???
//template <typename T>
//class deepcopy_smart_pointer
//{
//private:
//    T* m_pObject;
//public:
//    // ...other functions

//    //copy constructor of the deepcopy pointer
//    deepcopy_smart_pointer(const deepcopy_smart_pointer& source)
//    {
//        m_pObject = source->Clone();
//    }

//    //copy assignment operator
//    deepcopy_smart_pointer& operator=(const deepcopy_smart_pointer& source)
//    {
//        if(m_pObject)
//            delete m_pObject;
//        m_pObject = source->Clone();
//    }
//};

////26.3
//一个破坏性复制智能指针
//template<typename T>
//class destructivecopy_pointer
//{
//private:
//    T* pObject;
//public:
//    destructivecopy_pointer(T* pInput):pObject(pInput) {}
//    ~destructivecopy_pointer(){delete pObject};

//    //copy constructor
//    destructivecopy_pointer(destructivecopy_pointer& source)
//    {
//        pObject =source.pObject;

//        //destroy source
//        source.pObject =0;
//    }
//    //copy assignment operator 拷贝赋值运算符
//    //source ???
//    destructivecopy_pointer& operator= (destructivecopy_pointer& rhs)
//    {
//        if(pObject != source.pObject)
//        {
//            delete pObject;
//            pObject = source.pObject;
//            source.pObject =0;
//        }
//    }
//};

//int main()
//{
//    destructivecopy_pointer<int> pNumber(new int);
//    destructivecopy_pointer<int> pCopy(pNumber);
//}

////26.4
//#include<iostream>
//#include<memory>
//using namespace std;

//class Fish
//{
//public:
//    Fish(){cout<<"Fish:Constructored!"<<endl;}
//    ~Fish(){cout<<"Fish:Destructored!"<<endl;}

//    void Swim() const {cout<<"Fish swims in water"<<endl;}
//};

//void MakeFishSwim(const unique_ptr<Fish>& inFish)
//{
//    inFish->Swim();
//}

//int main()
//{
//    unique_ptr<Fish> smartFish(new Fish);

//    smartFish->Swim();
////    //不会复制,因为MakeFishSwim的参数为引用
//    MakeFishSwim(smartFish);
////    //并没有实例化对象
//    unique_ptr<Fish> copySmartFish;

//    //
//    //copySmartFish =smartFish;

//    return 0;
//}

////26.7.2   -2
//#include<memory>
//#include<iostream>
//using namespace std;

//class Fish
//{
//public:
//    Fish() {cout<<"Fish:Constructed!"<<endl;}
//    ~Fish() {cout<<"Fish: Destructed!"<<endl;}

//    void Swim(){ cout<<"Fish swims in water"<<endl;}
//};

//class Carp:public Fish
//{

//};
////引用不会导致切除问题
//void MakeFishSwim(const unique_ptr<Fish>& inFish)
//{
//    inFish->Swim();
//}

//int main()
//{
//    //注意类的实例化
//    unique_ptr<Fish> myCarp(new Carp);

//    MakeFishSwim(myCarp);

//    return 0;
//}

////27.1
////使用cout和iomanip控制符以10进制,16进制和8进制显示整数
//#include<iostream>
//#include<iomanip>

//using namespace std;
//int main()
//{
//    cout<<"Input an integer";

//    int Input =253;
//    //8进制
//    cout<<"Integer in octal: "<<oct<<Input<<endl;
//    //16进制
//    cout<<"Integer in hexadecimal: "<<hex<<Input<<endl;

//    cout<<setiosflags(ios_base::hex|ios_base::showbase|ios_base::uppercase);
//    cout<<Input<<endl;

//    cout<<resetiosflags(ios_base::hex|ios_base::showbase|ios_base::uppercase);
//    cout<<Input<<endl;

//    cout<<dec<<Input<<endl;
//}

////27.2
////科学表示法表示Pi和圆的面积
//#include<iostream>
//#include<iomanip>

//using namespace std;

//int main()
//{
//    const double Pi = (double)22.0/7;
//    cout<<Pi<<endl;

//    cout<<setprecision(7);

//    cout<<Pi<<endl;
//    //??
//    cout<<"fixed"<<fixed<<Pi<<endl;

//    cout<<"sciencific"<<scientific<<Pi<<endl;

//    cout<<"Area of circle: "<<2*Pi*5*5;

//}


////27.3
////设置字段宽度和设置填充字符
//#include<iostream>
//#include<iomanip>

//using namespace std;

//int main()
//{
//    cout<<setw(35);
//    cout<<"Hey-right aligined!"<<endl;

//    cout<<setw(35)<<setfill('*');
//    cout<<"Hey-right aligned!"<<endl;
//    cout<<"Hey-right aligned!"<<endl;
//}

////27.4
//#include<iostream>
//using namespace std;

//int main()
//{
//    int Input =12;
//    double Pi = 12.0;

//    char Char1 ='c',Char2 ='+',Char3 = '*';

//    cout<<Input<<endl;
//    cout<<Pi<<endl;
//    cout<<Char1<<Char2<<Char3<<endl;
//}

////27.8
////使用ofstream新建一个文本文件并向其写入文本
//#include<fstream>
//#include<iostream>
//#include<string>
//using namespace std;

//int main()
//{
//    ofstream myFile;
//    myFile.open("HelloFile.txt",ios_base::out);

//    if(myFile.is_open())
//    {
//        //文件输出呢呢
//        cout<<"File open successfully"<<endl;

//        myFile<<"My first text file!"<<endl;

//        myFile<<"Hello file";

//        cout<<"Finished writing to file,will close now"<<endl;

//        myFile.close();
//    }
//}

////27.9
////从创建的文件读取文本
//#include<fstream>
//#include<iostream>
//#include<string>
//using namespace std;

//int main()
//{
//    ifstream myFile;

//    myFile.open("HelloFile.txt",ios_base::in);

//    if(myFile.is_open())
//    {
//        cout<<"successful"<<endl;
//        string fileContents;

//        while(myFile.good())
//        {
//            //获取文件的内容
//            getline(myFile,fileContents);
//            cout<<fileContents<<endl;
//        }
//    }
//    else
//    {
//        cout<<"failed"<<endl;
//    }
//}

////27.10
////读写二进制文件
///
//#include<fstream>
//#include<iomanip>
//#include<string.h>
//#include<iostream>

//using namespace std;

//struct Human
//{
//    Human(){};
//    Human(const char* inName, int inAge,const char* inDOB):Age(inAge)
//    {
//        strcpy(Name,inName);
//        strcpy(DOB,inDOB);
//    }

//    char Name[30];
//    int Age;
//    char DOB[20];
//};

//int main()
//{
//    Human Input("Siddhartha Rao",101,"May 1910");
//    //ofstream 写文件
//    ofstream fsOut("MyBinary.bin",ios_base::out|ios_base::binary);

//    if(fsOut.is_open())
//    {
//        cout<<"Writing one object of Human to a binary file"<<endl;
//        fsOut.write(reinterpret_cast<const char*>(&Input),sizeof(Input));
//        fsOut.close();
//    }
//    //ifstream 读文件
//    ifstream fsIn("MyBinary.bin",ios_base::in|ios_base::binary);

//    if(fsIn.is_open())
//    {
//        Human somePerson;

//        fsIn.read((char*)& somePerson,sizeof(somePerson));

//        cout<<"Reading information from binary file."<<endl;
//        cout<<"Name = "<<somePerson.Name<<endl;
//        cout<<"Age = "<<somePerson.Age<<endl;
//        cout<<"Date of Birth = "<<somePerson.DOB<<endl;
//    }
//    return 0;
//}

////27.11
////使用std::stringstream 在整型和字符串之间转换
//#include<fstream>
//#include<sstream>
//#include<iostream>
//using namespace std;

//int main()
//{
//    cout<<"Enter an integer";
//    int Input =122222;
//    stringstream converterStream;
//    converterStream<<Input;
//    string strInput;
//    converterStream>>strInput;

//    cout<<"Integer Input = "<<Input<<endl;
//    cout<<"String gained from integer,strInput = "<<strInput<<endl;

//    stringstream anotherStream;
//    anotherStream<<strInput;
//    int Copy =0;
//    anotherStream>>Copy;

//    cout<<"Integer gained from string,Copy = "<<Copy<<endl;
//}


//////27.5
//////qt 不适合cin
//#include<stdio.h>
//#include<iostream>
//#include<string>
//using namespace std;

//int main()
//{
//    cout<<"Enter a line"<<endl;
//    char CStyleStr[10] ={0};
//    cin.get(CStyleStr,9);
//    cout<<"CStyleStr: "<<CStyleStr<<endl;

//    return 0;
//}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容