每日三百行代码 第二十天

C++ STL(标准模板库)是一套功能强大的 C++ 模板类,
提供了通用的模板类和函数,
这些模板类和函数可以实现多种流行和常用的算法和数据结构,
如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

容器(Containers)	
容器是用来管理某一类对象的集合。
C++ 提供了各种不同类型的容器,
比如 deque、list、vector、map 等。

算法(Algorithms)	
算法作用于容器。
它们提供了执行各种操作的方式,
包括对容器内容执行初始化、排序、搜索和转换等操作。

迭代器(iterators)	
迭代器用于遍历对象集合的元素。
这些集合可能是容器,也可能是容器的子集。
下面的程序演示了向量容器(一个 C++ 标准的模板),
它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,
会自动处理它自己的存储需求:

实例
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
   
   // 创建一个向量存储 int
   vector<int> vec; 
   int i;
 
   // 显示 vec 的原始大小
   cout << "vector size = " << vec.size() << endl;
 
   // 推入 5 个值到向量中
   for(i = 0; i < 5; i++){
   
      vec.push_back(i);
   }
 
   // 显示 vec 扩展后的大小
   cout << "extended vector size = " << vec.size() << endl;
 
   // 访问向量中的 5 个值
   for(i = 0; i < 5; i++){
   
      cout << "value of vec [" << i << "] = " << vec[i] << endl;
   }
 
   // 使用迭代器 iterator 访问值
   vector<int>::iterator v = vec.begin();
   while( v != vec.end()) {
   
      cout << "value of v = " << *v << endl;
      v++;
   }
 
   return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:

vector size = 0
extended vector size = 5
value of vec [0] = 0
value of vec [1] = 1
value of vec [2] = 2
value of vec [3] = 3
value of vec [4] = 4
value of v = 0
value of v = 1
value of v = 2
value of v = 3
value of v = 4

关于上面实例中所使用的各种函数,有几点要注意:

push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。
size( ) 函数显示向量的大小。
begin( ) 函数返回一个指向向量开头的迭代器。
end( ) 函数返回一个指向向量末尾的迭代器。

C++ 标准库

  • 标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。
  • 面向对象类库: 这个库是类及其相关函数的集合。

求两数最小公倍数

#include<bits/stdc++.h>
using namespace std;
int main()
{
   
    int n1, n2, max;
    cout << "输入两个数: ";
    cin >> n1 >> n2;
    // 获取最大的数
    max = (n1 > n2) ? n1 : n2;
    do{
   
        if (max % n1 == 0 && max % n2 == 0){
   
            cout << "LCM = " << max;
            break;
        }
        else
            ++max;
    } while (true);
     return 0;
}

求两数的最大公约数

#include <iostream>
using namespace std;
 
int main()
{
   
    int n1, n2;
 
    cout << "输入两个整数: ";
    cin >> n1 >> n2;
    
    while(n1 != n2)
    {
   
        if(n1 > n2)
            n1 -= n2;
        else
            n2 -= n1;
    }
 
    cout << "HCF = " << n1;
    return 0;
}
以上程序执行输出结果为:

输入两个整数: 78
52
HCF = 26

创建各类三角形图案

#include <iostream>
using namespace std;
 
int main()
{
   
    int rows;
 
    cout << "输入行数: ";
    cin >> rows;
 
    for(int i = 1; i <= rows; ++i)
    {
   
        for(int j = 1; j <= i; ++j)
        {
   
            cout << "* ";
        }
        cout << "\n";
    }
    return 0;
}
以上程序执行输出结果为:

*
* *
* * *
* * * *
* * * * *

#include <iostream>
using namespace std;
 
int main()
{
   
    int rows;
 
    cout << "输入行数: ";
    cin >> rows;
 
    for(int i = 1; i <= rows; ++i)
    {
   
        for(int j = 1; j <= i; ++j)
        {
   
            cout << j << " ";
        }
        cout << "\n";
    }
    return 0;
}
以上程序执行输出结果为:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

#include <iostream>
using namespace std;
 
int main()
{
   
    char input, alphabet = 'A';
 
    cout << "输入最后一个大写字母: ";
    cin >> input;
 
    for(int i = 1; i <= (input-'A'+1); ++i)
    {
   
        for(int j = 1; j <= i; ++j)
        {
   
            cout << alphabet << " ";
        }
        ++alphabet;
 
        cout << endl;
    }
    return 0;
}
以上程序执行输出结果为:

A
B B
C C C
D D D D
E E E E E

#include <iostream>
using namespace std;
 
int main()
{
   
    int rows;
 
    cout << "输入行数: ";
    cin >> rows;
 
    for(int i = rows; i >= 1; --i)
    {
   
        for(int j = 1; j <= i; ++j)
        {
   
            cout << "* ";
        }
        cout << endl;
    }
    
    return 0;
}
以上程序执行输出结果为:

* * * * *
* * * *
* * * 
* *
*

#include <iostream>
using namespace std;
 
int main()
{
   
    int rows;
 
    cout << "输入行数: ";
    cin >> rows;
 
    for(int i = rows; i >= 1; --i)
    {
   
        for(int j = 1; j <= i; ++j)
        {
   
            cout << j << " ";
        }
        cout << endl;
    }
 
    return 0;
}
以上程序执行输出结果为:

1 2 3 4 5
1 2 3 4 
1 2 3
1 2
1

#include <iostream>
using namespace std;
 
int main()
{
   
    int space, rows;
 
    cout <<"输入行数: ";
    cin >> rows;
 
    for(int i = 1, k = 0; i <= rows; ++i, k = 0)
    {
   
        for(space = 1; space <= rows-i; ++space)
        {
   
            cout <<" ";
        }
 
        while(k != 2*i-1)
        {
   
            cout << "* ";
            ++k;
        }
        cout << endl;
    }    
    return 0;
}
以上程序执行输出结果为:

        *
      * * *
    * * * * *
  * * * * * * *
* * * * * * * * *

#include <iostream>
using namespace std;
 
int main()
{
   
    int rows, count = 0, count1 = 0, k = 0;
 
    cout << "输入行数: ";
    cin >> rows;
 
    for(int i = 1; i <= rows; ++i)
    {
   
        for(int space = 1; space <= rows-i; ++space)
        {
   
            cout << " ";
            ++count;
        }
 
        while(k != 2*i-1)
        {
   
            if (count <= rows-1)
            {
   
                cout << i+k << " ";
                ++count;
            }
            else
            {
   
                ++count1;
                cout << i+k-2*count1 << " ";
            }
            ++k;
        }
        count1 = count = k = 0;
 
        cout << endl;
    }
    return 0;
}
以上程序执行输出结果为:

        1
      2 3 2
    3 4 5 4 3
  4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5

#include <iostream>
using namespace std;
 
int main()
{
   
    int rows;
 
    cout << "输入行数: ";
    cin >> rows;
 
    for(int i = rows; i >= 1; --i)
    {
   
        for(int space = 0; space < rows-i; ++space)
            cout << " ";
 
        for(int j = i; j <= 2*i-1; ++j)
            cout << "* ";
 
        for(int j = 0; j < i-1; ++j)
            cout << "* ";
 
        cout << endl;
    }
 
    return 0;
}
以上程序执行输出结果为:

* * * * * * * * *
  * * * * * * *
    * * * * *
      * * *
        *

#include <iostream>
using namespace std;
 
int main()
{
   
    int rows, coef = 1;
 
    cout << "Enter number of rows: ";
    cin >> rows;
 
    for(int i = 0; i < rows; i++)
    {
   
        for(int space = 1; space <= rows-i; space++)
            cout <<" ";
 
        for(int j = 0; j <= i; j++)
        {
   
            if (j == 0 || i == 0)
                coef = 1;
            else
                coef = coef*(i-j+1)/j;
 
            cout << coef << " ";
        }
        cout << endl;
    }
 
    return 0;
}
以上程序执行输出结果为:

           1
         1   1
       1   2   1
     1   3   3    1
   1  4    6   4   1
 1  5   10   10  5   1 

#include <iostream>
using namespace std;
 
int main()
{
   
    int rows, number = 1;
 
    cout << "输入行数: ";
    cin >> rows;
 
    for(int i = 1; i <= rows; i++)
    {
   
        for(int j = 1; j <= i; ++j)
        {
   
            cout << number << " ";
            ++number;
        }
 
        cout << endl;
    }
 
    return 0;
}
以上程序执行输出结果为:

1
2 3
4 5 6
7 8 9 10

判断闰年

#include <iostream>
using namespace std;
 
int main()
{
   
    int year;
 
    cout << "输入年份: ";
    cin >> year;
 
    if (year % 4 == 0)
    {
   
        if (year % 100 == 0)
        {
   
            // // 这里如果被 400 整除是闰年
            if (year % 400 == 0)
                cout << year << " 是闰年";
            else
                cout << year << " 不是闰年";
        }
        else
            cout << year << " 是闰年";
    }
    else
        cout << year << " 不是闰年";
 
    return 0;
}
以上程序执行输出结果为:

输入年份: 1990
1990 不是闰年

求一元二次方程的根

#include <iostream>
#include <cmath>
using namespace std;
 
int main() {
   
 
    float a, b, c, x1, x2, discriminant, realPart, imaginaryPart;
    cout << "输入 a, b 和 c: ";
    cin >> a >> b >> c;
    discriminant = b*b - 4*a*c;
    
    if (discriminant > 0) {
   
        x1 = (-b + sqrt(discriminant)) / (2*a);
        x2 = (-b - sqrt(discriminant)) / (2*a);
        cout << "Roots are real and different." << endl;
        cout << "x1 = " << x1 << endl;
        cout << "x2 = " << x2 << endl;
    }
    
    else if (discriminant == 0) {
   
        cout << "实根相同:" << endl;
        x1 = (-b + sqrt(discriminant)) / (2*a);
        cout << "x1 = x2 =" << x1 << endl;
    }
 
    else {
   
        realPart = -b/(2*a);
        imaginaryPart =sqrt(-discriminant)/(2*a);
        cout << "实根不同:"  << endl;
        cout << "x1 = " << realPart << "+" << imaginaryPart << "i" << endl;
        cout << "x2 = " << realPart << "-" << imaginaryPart << "i" << endl;
    }
 
    return 0;
}
以上程序执行输出结果为:

输入 a, b 和 c: 4
5
1
实根不同:
x1 = -0.25
x2 = -1