常用语法和数据结构

#include <iostream>
#include <vector>
#include <stack>
#include <queue> // 有队列、优先队列等
#include <set>
#include <map>
#include <assert>
using namespace std;

// 函数
int add(int a, int b) {
return a + b;
}

// 类和对象
class Rectangle {
public:
int width, height;

Rectangle(int w, int h) {
width = w;
height = h;
}

int area() {
return width * height;
}
};

int main() {
// 基本输入输出
int n;
cout << "Enter a number: ";
cin >> n;
cout << "You entered: " << n << endl;

// 数组
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; ++i) {
cout << arr[i] << " ";
}

// 动态数组
vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6);
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}

// 字符串
string str = "Hello, World!";
cout << str << endl;
str += " How are you?";

// 类和对象
Rectangle rect(10, 5);
cout << "Area: " << rect.area() << endl;

// STL容器-栈
stack<int> s;
s.push(1);
s.push(2);
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}

// STL容器-队列
queue<int> q;
q.push(1);
q.push(2);
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}

// STL容器-优先队列
priority_queue<int> pq;
pq.push(3);
pq.push(1);
while (!pq.empty()) {
cout << pq.top() << " ";
pq.pop();
}

// STL容器-集合
set<int> s = {3, 1, 2, 2};
for (auto it = s.begin(); it != s.end(); ++it) {
cout << *it << " ";
}

// STL容器-映射
map<string, int> m;
m["apple"] = 3;
m["banana"] = 2;
for (auto it = m.begin(); it != m.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}

// 指针(就是地址)
int a = 10;
int* p = &a; // 定义后, 指针p == `0x7ffffcbd4`
int* p = a; // ❌ error: p是`整型指针`, 只能被赋值为`整型数据的地址`.

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 数组名是一个指向数组第一个元素的指针
cout << *(ptr + 3) << " "; // 使用指针访问数组元素

int *ptr = new int; // 动态分配一个整数
*ptr = 10;
delete ptr; // 释放动态内存

// // 智能指针-unique_ptr
unique_ptr<int> ptr = make_unique<int>(10); // 创建一个 unique_ptr
cout << "Value: " << *ptr << endl;
// unique_ptr 会在离开作用域时自动释放内存

// // 智能指针-shared_ptr
shared_ptr<int> ptr1 = make_shared<int>(10); // 创建一个 shared_ptr
shared_ptr<int> ptr2 = ptr1; // 共享同一块内存

cout << "Value: " << *ptr1 << endl;
assert(ptr1.use_count() == 2); // 如果 a 不等于 b,程序会终止并打印错误信息

const int *ptr1 = &x; // 指向常量的指针,不能通过 ptr1 修改 x
int *const ptr2 = &x; // 常量指针,不能修改 ptr2 的指向, 可以修改x的值
const int *const ptr3 = &x; // 指向常量的常量指针, 指向、值都不能改

int (*func_ptr)(int, int) = add; // 定义一个指向函数的指针
int result = func_ptr(3, 4); // 通过函数指针调用函数

// 使用 lambda 表达式计算向量`nums`的总和
for_each(nums.begin(), nums.end(), [&sum](int n) {
sum += n;
});

// 异常处理
#include <stdexcept>
try {
int a = 10;
int b = 0;
if (b == 0) {
throw runtime_error("Division by zero");
}
cout << "Result: " << a / b << endl;
} catch (const exception &e) {
cout << "Error: " << e.what() << endl;
}

return 0;
}

常用算法

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
// 排序
vector<int> vec = {5, 2, 1, 4, 3};
sort(vec.begin(), vec.end());
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}

// 二分查找
bool found = binary_search(vec.begin(), vec.end(), 3);
cout << (found ? "Found" : "Not Found") << endl;

//


return 0;
}

技巧

  • 链表问题, 善用虚拟头节点, 可以避免处理初始的空指针情况.

Static Badge Static Badge Static Badge Static Badge
Copyright © 2023-2024 Raymond H., All Rights Reserved.