C++字符串操作
C++字符串操作 去除两端空白符 利用正则表达式匹配替换 string line = " hello, world!\t\t ";line = regex_replace(line, regex("^\\s+|\\s+$"), ""); // 匹配line两端的空白符,并替换为空串 按指定字符分割字符串 利用std::getline,其默认以换行符分割 vector<string> getTokens(const string& line, const char delimiter) { istringstream iss(line); vector<string> tokens; string token; while (getline(iss, token, delimiter)) { tokens.push_back(token); } return tokens;}string line...
C++泛型
C++泛型相关知识 参考南软2024秋C++高级程序设计课件generic1, generic2 C++程序的组织 头文件.h 头文件中一般放编译时常量const,各种声明,别名定义typedef,宏,内联函数,预处理等代码,并对需要向外扩展作用域的成员加上extern关键字 源文件.cc / .cpp 对应的,源文件中就要负责实现只在对应头文件中声明而没有定义的内容,比如函数定义、类成员定义等 作用域 分为: 程序级:比如#include的内容 文件级:比如全局变量、函数等 函数级:比如函数的最外层局部变量 块级:比如代码块的局部变量(for, while等) namespace 两种使用方式: 声明式declaration 直接使用directive 设有名空间L: namespace L { int k; void f(int); // ...} 声明式 using L::k;using L::f;k = 1;f(k); 直接使用 using namespace L;k =...
C++函数
C++函数基础知识 为什么函数参数需要指针 提高传输效率:直接传地址而不需要进行原类型下的值拷贝,如果原类型很大,这将是很耗时的;而地址的拷贝总是整数 利用函数的副作用:可能需要改变原内存中的数据,利用指针才能修改 如果确定不想修改地址中的值,可以传指针常量 函数指针 指向函数的指针 #include<bits/stdc++.h>using namespace std;double f(int);int g();int main() { // 声明函数指针 double (*fp)(int) = &f; // 解释:声明一个函数指针,返回值是double,带一个参数int int (*gp)() = &g; // 声明一个函数指针,返回值是int,不需要参数;*gp外面的()用来改变优先级,后面的()表示在描述参数,两者配合告诉编译器在声明函数指针 cout << (*fp)(1) << endl; // 2.2 cout << (*gp)() <<...
C++介绍
C++介绍 参考南软2024秋C++高级程序设计课件introduction, introduction2 C++历史 今年不考,以后应该也不会考了 C++的历史:1979-1991 在真实世界中为其进化一门语言:1991-2006 改变世界:2006-至今 C和C++的关系 C++完全包含C语言成分,C++支持C所支持的全部编程技巧(C的超集);同时C++还添加了OOP支持 任何C程序都能被C++用基本相同的方法编写,并具备相同的运行效率和空间 C++还引入了重载、内联函数、异常处理等功能,对C中的过程化控制及其功能进行了扩充 C++由以下4部分有机组成 C OOP STL Inside-Model 语言的类别 C/C++是静态强类型语言,C++比C”更“静态 结构化编程 程序 = 数据结构 + 算法 ADT Abstract Data Type...
C++面向对象编程进阶II
C++面向对象编程进阶II 参考南软2024秋C++高级程序设计课件CPP-2-3 多态 多态是面向对象编程语言的重要特性之一 同一论域中的一个元素可以有多种解释 提高语言灵活性 C++中的体现有: 一名多用(函数重载) 模板编程(template) 虚函数 操作符重载 C++重载类型 函数重载 函数同名但参数列表不同(后者必要条件) 静态绑定 操作符重载 重载的动机? 为了自定义数据类型可以像内置(built_in)数据类型一样运算 让编译器代替程序员展开计算(从运算符展到函数) 提高可读性 提高可扩展性 函数重载的细节 可以总结为通过规范匹配顺序来尽可能避免歧义的问题 精确匹配 当调用一个有多个重载版本的函数时,编译器会首先尝试进行精确匹配,即参数类型完全一致的函数签名,这种情况下的匹配最直接最合适。 void func(int);void func(double);func(42); //...
C++面向对象编程进阶I
C++面向对象编程进阶知识I 参考南软2024秋C++高级程序设计课件CPP-2-2 继承 派生类对应Java的子类,基类对应Java的父类 单继承 注意声明时不需要强调类之间的继承关系,定义时才需要,声明时带上继承关系会报编译错误 // class Student: public Person; // 编译错误class Student;// ...class Student: public Person { // ... }; 继承方式有:public, private, protected 三种继承方式的差异 继承方式 基类成员的访问权限 外部可访问性 使用场景 公有继承 公有成员 -> 公有,保护成员 -> 保护,私有成员不可访问 继承的公有成员对外可见,保护成员不可见 表示派生类是基类的一种特殊类型,符合“is-a”关系 保护继承 公有成员 -> 保护,保护成员 -> 保护,私有成员不可访问 外部无法访问任何基类成员,内部可访问 用于继承实现,内部使用基类成员,不暴露给外部 私有继承 公有成员...
C++面向对象编程基础
C++面向对象编程基础知识 参考南软2024秋C++高级程序设计课件 CPP-2-1 为什么使用面向对象 不使用面向对象的隐患 安全隐患:结构体的访问控制权是public的,这意味着其中所有变量外部可以自由访问,而某些状态应当只通过相关的函数调用更新 不符合数据类型定义:public权限带来的衍生问题,对外暴露出来的数据结构(实现)可能并不满足数据类型的定义/要求,如栈用数组实现,但数组对外暴露了,可在任意位置更新、操作而非栈顶、压栈、出栈。 使用面向对象 对数据结构进行封装,各司其职,利于对象之间的协作和任务分解 信息隐藏,对外暴露必要的接口和功能,而非实现 面向对象的视角 结构化编程 程序 = 算法 + 数据结构 面向对象编程 程序 = ∑\sum∑对象 对象 = 数据 + 行为(体现职责) 信息传递:函数调用 用类来管理 面向对象体系下的项目开发流程 需求,架构,构建模式,代码,测试用例,项目组织 评价标准:开发效率 封装 类 成员变量 成员函数 默认提供的函数 编译器会为类提供一些默认函数,只要你不显式地声明相关的函数 class Empty...
C++常用二分库函数
容器相关二分 在有序容器中找第一个大于或大于等于指定元素的迭代器 第一个大于:upper_bound 第一个大于等于:lower_bound #include <bits/stdc++.h>using namespace std;int main() { vector<int> arr = {1, 6, 9, 10, 15, 16, 20, 23, 55, 78, 98, 100}; auto it = upper_bound(arr.begin(), arr.end(), 8); cout << distance(arr.begin(), it) << ": " << *it << endl; it = upper_bound(arr.begin(), arr.end(), 23); cout << distance(arr.begin(), it) << ": " <<...
C++部分作业代码
数据结构与算法部分 题目见https://github.com/NJU-ymhui/NJUSE-2024Cpp-problems 滑动窗口:最短子数组 字符串处理: 密钥格式化 哈希:字母频率统计, 电子表 二分:方程的解, 原料采购, 卡片游戏 最短路径:外卖骑手 搜索:外卖骑手, 消灭星星 贪心:采购日志, 校园祭打卡, 不重叠时间段 技巧:不重叠时间段, 卡片游戏 C++库:电子表 暴力(可解不超时):卡片游戏 快速幂:矩阵快速幂 最短子数组 #include <bits/stdc++.h>using namespace std;int main() { int n, target = 0; vector<int> arr; cin >> n; arr.resize(n, 0); for (int i = 0; i < n; i++) { cin >> arr[i]; } cin >> target; int...
C++时间处理
从标准时间转化为Unix时间戳 使用<ctime>库 核心数据结构: tm, time_t 核心API: time_t mktime(tm* __std_time__); 将特定字符串根据指定格式提取出时间格式数据并存入tm地址中: std::istringstream >> get_time(tm* __addr__, string format); #include <bits/stdc++.h>using namespace std;int main() { tm time_struct = {}; time_struct.tm_year = 2024 - 1900; // 始于1900 time_struct.tm_mon = 12 - 1; // 从0开始 time_struct.tm_mday = 18; // 天 time_struct.tm_hour = 8; // 时 time_struct.tm_min = 52; // 分 ...