Part01、02 基础知识与编程环境、C++ 程序设计
CSP-S 初赛备赛知识文档(1)
2.2.1 基础知识与编程环境
1. Linux 系统终端中常用的文件与目录操作命令 【5】
基本文件操作:
ls
- 列出目录内容cd
- 切换目录pwd
- 显示当前目录mkdir
- 创建目录rm
- 删除文件rmdir
- 删除目录cp
- 复制文件mv
- 移动文件
文件查看:
cat
- 显示文件内容more
/less
- 分页显示文件head
/tail
- 显示文件开头/结尾
权限管理:
chmod
- 修改文件权限chown
- 修改文件所有者
2. Linux 系统下常见文本编辑工具的使用 【5】
Vim 编辑器:
- 模式切换:
i
(插入),Esc
(命令),:
(底行) - 保存退出:
:wq
- 不保存退出:
:q!
- 基本移动:
h,j,k,l
或方向键
Nano 编辑器:
- 更简单的文本编辑器
Ctrl+O
保存,Ctrl+X
退出
3. g++、gcc 等编译器与相关编译选项 【5】
基本编译命令:
g++ -o program program.cpp # 编译C++程序
gcc -o program program.c # 编译C程序
常用编译选项:
-O2
- 优化级别2-Wall
- 显示所有警告-std=c++11
- 指定C++标准-g
- 生成调试信息
4. 在 Linux 系统终端中运行程序,使用 time 命令查看程序用时 【5】
运行程序:
./program # 运行可执行文件
./program < input.txt # 重定向输入
./program > output.txt # 重定向输出
计时命令:
time ./program # 测量程序运行时间
输出格式:
- real: 实际时间
- user: 用户态CPU时间
- sys: 内核态CPU时间
5. 调试工具 GDB 的使用 【5】
启动调试:
gdb ./program # 启动GDB调试
常用命令:
break main
- 在main函数设置断点run
- 运行程序next
- 执行下一行step
- 步入函数print var
- 打印变量值continue
- 继续执行quit
- 退出GDB
2.2.2 C++ 程序设计
1. 类(class)
类的概念及简单应用 【6】
类定义:
class MyClass {
private:int privateVar; // 私有成员
public:int publicVar; // 公有成员// 构造函数MyClass(int x) : publicVar(x) {}// 析构函数~MyClass() {cout << "析构函数调用" << endl;}// 成员函数void show() {cout << publicVar << endl;}
};
对象创建:
MyClass obj(10); // 创建对象
obj.show(); // 调用成员函数
成员函数和运算符重载 【6】
成员函数重载:
class Vector {
public:int x, y;// 运算符重载Vector operator+(const Vector& other) {return {x + other.x, y + other.y};}// 友元函数重载friend ostream& operator<<(ostream& os, const Vector& v) {return os << "(" << v.x << ", " << v.y << ")";}
};
使用示例:
Vector v1{1, 2}, v2{3, 4};
Vector v3 = v1 + v2; // 运算符重载
cout << v3 << endl; // 输出重载
继承与多态 【6】
继承概念:
// 基类
class Animal {
protected:string name;
public:Animal(string n) : name(n) {}virtual void speak() = 0; // 纯虚函数virtual ~Animal() {} // 虚析构函数
};// 派生类
class Dog : public Animal {
public:Dog(string n) : Animal(n) {}void speak() override {cout << name << " says: Woof!" << endl;}
};class Cat : public Animal {
public:Cat(string n极) : Animal(n) {}void speak() override {cout << name << " says: Meow!" << endl;}
};
多态使用:
int main() {Animal* animals[2];animals[0] = new Dog("Buddy");animals[1] = new Cat("Whiskers");for (int i = 0; i < 2; i++) {animals[i]->speak(); // 多态调用delete animals[i]; // 正确调用派生类析构函数}return 0;
}
继承类型:
public
- 公有继承(基类成员保持原有访问权限)protected
- 保护继承(基类公有和保护成员变为保护)private
- 私有继承(基类所有成员变为私有)
多态要点:
virtual
- 声明虚函数,实现运行时多态override
- 明确表示重写基类虚函数final
- 禁止进一步重写或继承- 虚析构函数确保正确释放派生类资源
2. STL 模板
容器(container)和迭代器(iterator) 【5】
常用容器:
vector
- 动态数组list
- 双向链表deque
- 双端队列
迭代器使用:
vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}
对(pair)、元组(tuple) 【5】
pair 使用:
pair<int, string> p = {1, "hello"};
cout << p.first << " " << p.second << endl;
tuple 使用:
tuple<int, string, double> t = {1, "test", 3.14};
cout << get<0>(t) << " " << get<1>(t) << endl;
集合(set)、多重集合(multiset) 【5】
set 使用:
set<int> s = {3, 1, 4, 1, 5}; // {1, 3, 4, 5}
s.insert(2); // 插入元素
if (s.find(3) != s.end()) { // 查找元素cout << "Found" << endl;
}
multiset 使用:
multiset<int> ms = {1, 1, 2, 2, 3}; // 允许重复元素
双端队列(deque)、优先队列(priority_queue) 【5】
deque 使用:
deque<int> dq;
dq.push_front(1); // 前端插入
dq.push_back(2); // 后端插入
int front = dq.front(); // 访问前端
int back = dq.back(); // 访问后端
priority_queue 使用:
// 最大堆(默认)
priority_queue<int> maxHeap;
maxHeap.push(3);
maxHeap.push(1);
maxHeap.push(4);
cout << maxHeap.top() << endl; // 输出4// 最小堆
priority_queue<int, vector<int>, greater<int>> minHeap;
映射(map)、多重映射(multimap) 【5】
map 使用:
map<string, int> m;
m["apple"] = 5;
m["banana"] = 3;for (auto& [key, value] : m) {cout << key << ": " << value << endl;
}
multimap 使用:
multimap<string, int> mm;
mm.insert({"fruit", 1});
mm.insert({"fruit", 2}); // 允许重复键
算法模板库中的常用函数 【5】
排序和查找:
#include <algorithm>
vector<int> v = {5, 3, 1, 4, 2};sort(v.begin(), v.end()); // 排序
auto it = find(v.begin(), v.end(), 3); // 查找if (binary_search(v.begin(), v.end(), 3)) {cout << "Found" << endl;
}
数值算法:
int sum = accumulate(v.begin(), v.end(), 0);
int max_val = *max_element(v.begin(), v.end());
int min_val = *min_element(v.begin(), v.end());
变换算法:
transform(v.begin(), v.end(), v.begin(), [](int x) { return x * 2; });
数学公式
时间复杂度计算
常见时间复杂度:
- O(1)O(1)O(1) - 常数时间复杂度
- O(logn)O(\log n)O(logn) - 对数时间复杂度
- O(n)O(n)O(n) - 线性时间复杂度
- O(nlogn)O(n \log n)O(nlogn) - 线性对数时间复杂度
- O(n2)O(n^2)O(n2) - 平方时间复杂度
- O(2n)O(2^n)O(2n) - 指数时间复杂度
空间复杂度计算
S(n)=O(f(n))S(n) = O(f(n)) S(n)=O(f(n))
其中 f(n)f(n)f(n) 表示算法所需的额外空间与输入规模 nnn 的关系。
CSP-S 提高组初赛复习大纲
更新时间:2025 年 9 月 18 日 23:21:08
- 2.2.1 基础知识与编程环境 & C++ 程序设计
- 2.2.3 数据结构
- 2.2.4 算法
- 2.2.5 数学与其他