C++编译 #
MYSYS不同平台终端区别
| 终端 | 编译器 | 目标平台 | 运行库 | 主要用途 |
|---|---|---|---|---|
| MSYS2 MINGW64 | GCC | 64位 Windows | MSVCRT (传统) | 传统 Windows 程序开发(兼容性好) |
| MSYS2 UCRT64 | GCC | 64位 Windows | Universal CRT (现代) | 现代 Windows 程序(Win10+推荐) |
| MSYS2 CLANG64 | Clang/LLVM | 64位 Windows | Universal CRT | 使用 Clang 编译器 |
| MSYS2 CLANGARM64 | Clang/LLVM | ARM64 Windows | Universal CRT | ARM 设备(Surface Pro X等) |
| MSYS2 MSYS | GCC | MSYS2 环境 | msys-2.0.dll | MSYS2 自身工具,Unix 工具 |
知识点 #
浮点数 #
float double 双精度浮点数
输入输出控制 #
#include <iomanip>
cout << fixed << setprecision(2) << 3.14159265358979323846 << endl; //输出固定小数点后2位
cout << scientific << 3.14159265358979323846 << endl; //输出科学计数法
cout << setfill('0') << setw(2) << goHour << ":" << setfill('0') << setw(2) << goMinute << endl; //输出时间,setw(2)设置宽度为2,setfill('0')设置填充字符为0,这样当goHour或goMinute小于10时会在前面补0
字符串 #
常用函数
#include<string>
string example;
example.length();//返回长度
字符整数与int整数转换,不能直接(int)ch,这样得到的是ASCII码,而是要
//将字符数字转换为整数数字
char ch;
int digit = ch - '0';
//将string字符串转为数字
#include<string>
string str;
int digit = stoi(str);
//将整数数字转换为字符数字
char ch2 = digit + '0';
数组与vector #
一般情况下,在绝大多数现代C++工程中,优先使用vector是明智的选择,除了在编译时已知的微小固定大小数组、需要与其他语言或硬件交互的缓冲区、对栈上性能有极端要求的核心循环局部变量、或者在某些嵌入式环境限制下等,使用vector取代数组是毋庸置疑的。 vector常用:
#include<vector>
vector<int> vec;
vec.empty(); //判断是否为空,为空返回true
vec.clear(); //清空容器
vec.erease(vec.begin());
sort(vec.begin(),vec.end()); //升序排序#include<algorithm>
类 class #
可以用构造函数对类的对象进行赋值和初始化,构造函数可以重载
类的惯例:
- 在类体内部对成员函数作声明,而在类体外部进行定义;
- 成员变量大都以m_开头,这是约定成俗的写法,不是语法规定的内容。以m_开头既可以一眼看出这是成员变量,又可以和成员函数中的形参名字区分开。
- 根据C++软件设计规范,实际项目开发中的成员变量以及只在类内部使用的成员函数(只被成员函数调用的成员函数)都建议声明为 private,而只将允许通过对象调用的成员函数声明为 public。
- 给成员变量赋值的函数通常称为 set 函数,它们的名字通常以set开头,后跟成员变量的名字;读取成员变量的值的函数通常称为 get 函数,它们的名字通常以get开头,后跟成员变量的名字。
惯例 #
- 将 std 直接声明在所有函数外部,这样虽然使用方便,但在中大型项目开发中是不被推荐的,这样做增加了命名冲突的风险,推荐在函数内部声明 std
常用算法 #
分离整数的各位 #
// 分离整数的各位
vector<int> seprateNum(int n)
{
vector<int> out;
int a = n;
for (int i = 0; ;i++)
{
if (i == 0)
{
out.push_back(a % 10);
continue;
}
a = (a-out[i-1])/10;
if (a == 0) return out;
out .push_back(a % 10);
}
}
回文数判断与生成 #
//判断是否是回文数
bool isPalindrome(size_t a)
{
if (a != 0 && a%10 == 0) return false; //以0结尾的数(除0)不是回文数
size_t reversed = 0,original = a; //存储反转后的数和输入的数
while (original > 0)
{
reversed = reversed*10 + original%10;
original /= 10;
}
return a == reversed; //判断是否是回文数
}
// 生成位数小于等于len的奇数位回文数
vector<size_t> findPalindromes(size_t len)
{
vector<size_t> palindromes; // 存储生成的回文数
// 循环生成前半部分数字:i从10开始(对应3位回文数的前半部分),到10^(len/2)结束
for (size_t i=10; i <= pow(10,len/2); i++)
{
string left = to_string(i); // 将前半部分数字转为字符串(如i=12→"12")
string right(left.rbegin(), left.rend()); // 反转前半部分:"12"→"21" rbegin():反向遍历,begin():正向遍历
// 拼接奇数位回文数:前半部分 + 反转后的后半部分(去掉第0位,避免重复中间位)
// 例:"12"+"21".substr(1) → "12"+"1" → "121"
string palindromeStr = left + right.substr(1);
// 字符串转无符号长长整数,适配大数(如9989899)
size_t palindromeNum = stoull(palindromeStr);
// 硬编码限制:超过1亿则停止生成
if (palindromeNum > 100000000) break;
palindromes.push_back(palindromeNum); // 符合条件则加入结果集
}
return palindromes;
}
质数判断 #
//判断是否是质数
bool isPrime(size_t a)
{
if (a<=1) return false;
if (a == 2) return true;
if (a % 2 == 0) return false;
for (size_t i=3; i <= sqrt(a); i += 2)
{
if (a%i == 0) return false;
}
return true;
}
SFML: #
下载网站:SFML官方下载地址,版本对应要按照要求的来,下载解压后将bin文件夹添加到环境变量即可。
关于用快捷键指定普通C++任务和SFML库任务 #
在tasks.json中设置两个任务,而后在keybindings.json中指定任务对应的快捷键
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Run C++ Program",
"type": "shell",
"command": "cmd",
"args": [
"/c",
"g++ \"${file}\" -o \"${fileDirname}\\${fileBasenameNoExtension}.exe\" && \"${fileDirname}\\${fileBasenameNoExtension}.exe\" && pause"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
},
{
"label": "Run SFML Program",
"type": "shell",
"command": "cmd",
"args": [
"/c",
"g++ -c \"${file}\" -I\"D:/CodeEnvironment/SFML/SFML-3.0.2/include\" && g++ \"${fileBasenameNoExtension}.o\" -o \"${fileBasenameNoExtension}.exe\" -L\"D:/CodeEnvironment/SFML/SFML-3.0.2/lib\" -lsfml-graphics -lsfml-window -lsfml-system -mwindows && del \"${fileBasenameNoExtension}.o\" && \"${fileBasenameNoExtension}.exe\" && pause"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}
]
}
keybindings,json,通过Ctrl+Shift+P,搜索keyboard shortcuts,打开键盘快捷方式(JSON)
// 将键绑定放在此文件中以覆盖默认值
[
{
"key": "ctrl+alt+c",
"command": "workbench.action.tasks.runTask",
"args": "Run C++ Program"
},
{
"key": "ctrl+alt+s",
"command": "workbench.action.tasks.runTask",
"args": "Run SFML Program"
}
]
需要注意的是,快捷方式中的任务名需要与tasks.json中的任务名相同。