每日三百行代码 第二十天
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