跳过正文
  1. 文章列表/

CPP知识点

·1937 字·4 分钟·
RayChaux
作者
RayChaux

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中的任务名相同。

通过邮件回复