C++ 学习
C++ 学习
介绍
C++ 数值优化库:GitHub - mlpack/ensmallen: A header-only C++ library for numerical optimization –
参考资料
速查表
Effective Modern C++ 中文翻译版:简介 - Effective Modern C++
GitHub - ShujiaHuang/Cpp-Primer-Plus-6th: 《C++ Primer Plus 第6版(中文版)》原书代码、习题答案和个人笔记,仅供学习和交流。
cppreference.com(页面可转换成中文)
序言 现代 C++ 教程: 高速上手 C++ 11/14/17/20 - Modern C++ Tutorial: C++ 11/14/17/20 On the Fly
GitHub - pranabdas/c-cpp: Learning programming concepts in C and C++
与化学相关的 cpp 教程:GitHub - CrawfordGroup/ProgrammingProjects: C++ Programming Tutorial in Chemistry
一个可供参考的 cpp 源代码(mpi、命令行参数相关):GitHub - idocx/CS267-HW2-2
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库_Mindtechnist的博客-CSDN博客
CPP-Primer
使用
工具
filesystem 标准库:Filesystem library (since C++17) - cppreference.com
命令行参数解析
运行
1 | g++ main.cpp # 可执行文件名称默认为 a.out |
头文件搜索规则:
- 从
-I
开始 - 找环境变量
C_INCLUDE_PATH
、CPLUS_INCLUDE_PATH
、OBJC_INCLUDE_PATH
指定的路径 - 找默认目录
/usr/include
、/usr/local/include
等
Linux 头文件路径:/usr/include
或 /usr/local/include
库文件路径:/usr/lib
或 /usr/local/lib
(.so
动态库 .a
静态库)
静态链接库:
lib*.a
(Linux)、*.lib
(Windows)- 静态链接库本质上是一个归档文件,它包含了一个或多个目标文件(
.o
文件,包含了编译后的代码和数据)。使用静态链接库时,链接器会将这些目标文件中的代码和数据直接嵌入到最终生成的可执行文件中 - 优点:运行速度快;缺点:目标文件大,且静态链接不能共享
- 静态链接库本质上是一个归档文件,它包含了一个或多个目标文件(
动态链接库:
lib*.so
(Linux; Shared Object,SO,共享对象)、*.dll
(Windows; Dynamic Link Library, DLL)- 在运行时链接对应的库来访问这些函数
- 可被多个程序所共享
构建静态链接库
1 | # 假设有 add.c minus.c main.c add_minus.h |
- 构建动态链接库
1 | gcc -fPIC -shared add.c minus.c -o libadd_minus.so |
Makefile
1 | CC=g++ |
调试
gdb 或 cppcheck
GDB 使用入门:Note/wiki/gdb.md at master · Kicamon/Note · GitHub
1 | gdb main.o |
语法
\n
比 endl
快(endl
会刷新缓冲区)
数组索引从 0 开始,没有像 Python 中一样使用 -1 表示最后一个元素的特殊用法
1 |
|
数据类型
十进制整数不能以 0 开头(会被认为是八进制整数)
字符用单引号,字符串用双引号(相当于字符数组)
1 |
|
数组
1 | // 一维数组定义 |
流程控制
if 条件
1 | if (condition) // if 后面不加分号 |
for 循环
1 |
基于范围的 for 循环的语法如下:
1 | for (element_declaration : range_expression) { |
其中,element_declaration 是一个变量,用于存储每次迭代中的元素值。range_expression 是一个表示要遍历的容器或对象的表达式。
文件 IO
1 |
格式化输出
1 | // 方式 1 |
函数
函数中引用参数的作用:修改传递给函数的变量的值:通过引用参数,函数可以修改传递给它们的变量的值,这样可以在函数内部对变量进行修改,并将修改后的值反映到函数外部。
类
C++ 中 class 和 struct 并无本质区别,只是默认的访问权限不同(class 默认 private,struct 默认 public)
权限有三种:
- public:公有
- private:私有(只有同类可以访问)
- protected:保护(只有同类和子类可以访问)
结构体
WIP…
重载
函数重载
运算符重载
C++ 新特性
模板 template
T 表示参数类型
1 | template <class T> |
函数模板
类模板
其他
字符串转整数:
stoi()
(标准库中的函数)atoi()
(C 风格的函数)
解析命令行参数:c++ - What does int argc, char *argv[] mean? - Stack Overflow
1 |
|
库
<iostream>
:基本输入输出流;cin
,cout
,cerr
,endl
<fstream>
:文件输入输出流;ifstream
,ofstream
,fstream
<sstream>
:字符串流;istringstream
,ostringstream
,stringstream
<cmath>
:提供数学函数支持;sin()
,cos()
,exp()
,log()
,sqrt()
<ctime>
:传统的 C 语言日期和时间函数;time()
,
string
string
、string.h
和 cstring
之间的区别:
string
:string
是 C++ 标准库中的一个类,位于命名空间std
中。它提供了一种更高级、更安全和更方便的字符串处理方式。string
类提供了许多成员函数和操作符重载,用于操作和处理字符串。使用string
类可以更容易地进行字符串的拼接、查找、替换等操作,而且不需要手动管理内存。string.h
:string.h
是 C 语言标准库中的一个头文件,用于操作 C 风格的字符串(字符数组)。它提供了一些用于字符串操作的函数,如strcpy
、strlen
、strcat
等。这些函数需要手动管理内存,并且对于一些边界情况需要特别小心,以避免缓冲区溢出和内存错误。cstring
:cstring
是 C++ 标准库中的一个头文件,对应于 C 语言的string.h
头文件。它提供了与string.h
相同的 C 风格字符串操作函数,如strcpy
、strlen
、strcat
等。使用cstring
头文件可以在 C++ 中使用 C 语言的字符串操作函数。
总的来说,string
类提供了更高级、更安全和更方便的字符串处理方式,而 string.h
和 cstring
提供了 C 语言风格的字符串操作函数,需要手动管理内存。在 C++ 中,更推荐使用 string
类来进行字符串操作,除非有特定的原因需要使用 C 语言的字符串操作函数。
在 C++ 中,<cstring>
头文件是 C 语言标准库中的头文件 <string.h>
的 C++ 版本。因此,当包含 <cstring>
头文件时,C++ 编译器会自动将 <string.h>
中的函数放在 std
命名空间中。
因此,当您包含 <cstring>
头文件时,可以直接使用 strcpy
函数,因为它已经在 std
命名空间中。这意味着您可以使用 std::strcpy
或者直接使用 strcpy
,它们是等效的。
而在 <string.h>
头文件中,函数是直接定义在全局命名空间中,因此只能使用 strcpy
,而不能使用 std::strcpy
。
总结起来,<cstring>
头文件提供了 C 语言字符串操作函数的 C++ 版本,并将这些函数放在了 std
命名空间中,因此可以使用 std::strcpy
或者直接使用 strcpy
。而 <string.h>
头文件中的函数是直接定义在全局命名空间中,只能使用 strcpy
。
vector
array
Eigen
- 安装:下载源代码,可放到任意路径下
1 | brew install eigen # macOS;头文件 /opt/homebrew/include/eigen3 |
- 编译
1 | g++ main.cpp -o main -I /path/eigen |