当前位置: 首页 > news >正文

C++指南-标准库,数学库,数据结构

C++标准库概览

C++标准库是C++语言的组成部分,提供了大量的工具和函数,以支持各种编程任务。

输入输出流

输入输出流类

std::iostream:基础输入输出流类。
std::istream:处理输入流的抽象类。
std::ostream:处理输出流的抽象类。
std::cin:标准输入流(关联键盘)。
std::cout:标准输出流(关联屏幕)。
std::cerr:用于输出错误信息的标准输出流。
使用方法

#include <iostream>

int main() {
    std::cout << "Enter an integer: ";
    int num;
    std::cin >> num;
    std::cout << "You entered: " << num << std::endl;
    return 0;
}

在C++中,std::iostream、std::istream 和 std::ostream 是处理输入和输出流的基类。虽然 std::iostream 可以处理输入和输出,但它通常是作为 std::cin 和 std::cout 的基础类存在。对于文件输入输出,我们通常使用 std::ifstream 和 std::ofstream,它们分别继承自 std::istream 和 std::ostream。

以下是使用 std::ifstream 读取文件的基本用法:

包含头文件

#include <iostream>
#include <fstream>

创建 std::ifstream 对象

std::ifstream file("example.txt"); // 尝试打开 example.txt 文件

检查文件是否成功打开

if (!file) {
    std::cerr << "Unable to open file!" << std::endl;
    return 1; // 或者其他错误处理
}

读取文件内容

std::string line;
while (getline(file, line)) { // 使用 getline 读取每行
    std::cout << line << std::endl;
}

使用输入流操作符

int num;
file >> num; // 从文件中读取一个整数

关闭文件
虽然 std::ifstream 的析构函数会自动关闭文件,但最好显式关闭文件以释放资源:

file.close();

完整示例

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ifstream file("example.txt");

    if (!file) {
        std::cerr << "Unable to open file!" << std::endl;
        return 1;
    }

    std::string line;
    while (getline(file, line)) {
        std::cout << line << std::endl;
    }

    // 或者使用流操作符读取数据
    // int num;
    // file >> num;
    // std::cout << "Read number: " << num << std::endl;

    file.close(); // 关闭文件
    return 0;
}

标准数学库

C++ 的标准数学库提供了大量的数学函数,这些函数定义在 (C++17 之前称为 <math.h>)头文件中。以下是一些常用的标准数学函数及其示例。

包含头文件
在使用这些函数之前,需要包含 头文件:

#include <iostream>
#include <cmath>

幂函数
pow:求幂。
sqrt:求平方根。

auto result = std::pow(2, 3);    // 2 的 3 次方
std::cout << "Power: " << result << std::endl;

result = std::sqrt(16);          // 16 的平方根
std::cout << "Square root: " << result << std::endl;

三角函数
sin:正弦。
cos:余弦。
tan:正切。

result = std::sin(0);            // 0 弧度的正弦
std::cout << "Sine of 0: " << result << std::endl;

result = std::cos(std::acos(-1)); // 余弦的反函数,求 -1 的余弦值
std::cout << "Cosine of arccos(-1): " << result << std::endl;

result = std::tan(1);            // 1 弧度的正切
std::cout << "Tangent of 1: " << result << std::endl;

对数和指数函数
log:自然对数。
log10:以 10 为底的对数。
exp:指数函数 e 的幂。

result = std::log(1.0);          // 1 的自然对数
std::cout << "Natural logarithm of 1: " << result << std::endl;

result = std::log10(100);        // 100 的以 10 为底的对数
std::cout << "Logarithm base 10 of 100: " << result << std::endl;

result = std::exp(1);            // e 的 1 次方
std::cout << "e to the power of 1: " << result << std::endl;

绝对值和取整
abs:绝对值。
round:四舍五入。

result = std::abs(-5);           // -5 的绝对值
std::cout << "Absolute value: " << result << std::endl;

result = std::round(2.5);        // 2.5 四舍五入
std::cout << "Rounded value: " << result << std::endl;

浮点数函数
floor:向下取整。
ceil:向上取整。

result = std::floor(3.7);       // 3.7 向下取整
std::cout << "Floor value: " << result << std::endl;

result = std::ceil(3.3);        // 3.3 向上取整
std::cout << "Ceil value: " << result << std::endl;

特殊函数
fmod:求余函数。
modf:分解浮点数为整数部分和小数部分。

double remainder;
result = std::fmod(5.7, 3);     // 5.7 除以 3 的余数
std::cout << "Fmod remainder: " << result << std::endl;

double intpart;
modf(56.78, &intpart);          // 56.78 分解为整数部分和小数部分
std::cout << "Modf integer part: " << intpart << std::endl;

随机数
rand:生成随机数。
srand:设置随机数种子。

std::srand(0);                   // 设置随机数种子
result = std::rand();            // 生成随机数
std::cout << "Random number: " << result << std::endl;

请注意,std::rand() 生成的随机数质量有限,对于更高质量的随机数生成,可以考虑使用 库中提供的随机数生成器。

数据结构

序列式容器
std::vector:动态大小数组,提供快速随机访问。
std::deque:双端队列,提供快速两端插入和删除。
std::list:双向链表,提供快速插入和删除。
std::forward_list:单向链表,提供快速插入和删除。
关联容器
std::map:基于红黑树实现的键值对映射,保持键的排序。
std::set:基于红黑树实现的元素集合,保持元素唯一性。
std::multimap:允许多个元素与同一键关联的映射。
std::multiset:允许多个相同元素的集合。
无序容器(C++11 新增)
std::unordered_map:基于哈希表的键值对映射。
std::unordered_set:基于哈希表的元素集合。
std::unordered_multimap:允许多个元素与同一键关联的无序映射。
std::unordered_multiset:允许多个相同元素的无序集合。
容器适配器
std::stack:后进先出(LIFO)的栈。
std::queue:先进先出(FIFO)的队列。
std::priority_queue:优先队列,元素按优先级排序。
示例代码

#include <iostream>
#include <vector>
#include <map>
#include <set>

int main() {
    // 使用 vector
    std::vector<int> vec = {1, 2, 3, 4, 5};
    vec.push_back(6); // 添加元素
    std::cout << "Vector contains: ";
    for (int num : vec) {
        std::cout << num << ' ';
    }
    std::cout << std::endl;

    // 使用 map
    std::map<std::string, int> myMap;
    myMap["apple"] = 1;
    myMap["banana"] = 2;
    std::cout << "Map contains: ";
    for (const auto& pair : myMap) {
        std::cout << pair.first << " => " << pair.second << ' ';
    }
    std::cout << std::endl;

    // 使用 set
    std::set<int> mySet = {1, 2, 3, 4, 5};
    mySet.insert(6); // 添加元素
    std::cout << "Set contains: ";
    for (int num : mySet) {
        std::cout << num << ' ';
    }
    std::cout << std::endl;

    return 0;
}

相关文章:

  • 参数校验学习笔记
  • 快充协议方案 TYPE-C口取电支持PD5V、 9V、 12V、 15V、 20V
  • Unity3D DOTS中ECS核心架构详解
  • Windows上安装 nodejs,npm 和 yarn详细教程
  • 玩转云服务:Oracle Cloud甲骨文永久免费云主机配置指南(续)
  • python基础(13魔法方法介绍)
  • 江协科技STM32学习- P7 GPIO输入
  • 打造 LLMOps 时代 Prompt 数据驱动引擎
  • Java、python、php版 美发美甲预约服务平台 美容院管理系统(源码、调试、LW、开题、PPT)
  • Python相关系数导图
  • ChatGPT 3.5/4新手使用手册(附:案例)
  • 如何禁止电脑访问网站
  • 看论文文献用哪种阅读器比较好?
  • “决胜面试:高频题目与算法策略一览”
  • 机器学习 之 决策树与随机森林的实现
  • 知乎知+和信息流广告报价,知乎推广多少钱?
  • keil中内存的存储规律
  • 最新国内Docker 安装
  • 华为eNSP:静态路由配置、浮动路由配置
  • 搜维尔科技:利用 Xsens最大程度提高影视动画制作效率
  • 医学统计专家童新元逝世,终年61岁
  • 关于新冠疫情防控与病毒溯源的中方行动和立场
  • 住房和城乡建设部办公厅主任李晓龙已任部总工程师
  • 锦江酒店:第一季度营业收入约29.42亿元,境内酒店出租率同比增长
  • 中行一季度净赚超543亿降2.9%,利息净收入降逾4%
  • 浙江官宣:五一假期,没电、没气、没油车辆全部免费拖离高速