Cơ Bản
Hello World
#include int main() { std::cout << "Hello, World!" << std::endl; return 0; }
Biên Dịch & Chạy
g++ -std=c++20 -Wall -o app main.cpp ./app clang++ -std=c++20 -o app main.cpp
Biến & Hằng
int x = 42; auto y = 3.14; // suy luận kiểu const int MAX = 100; constexpr int SIZE = 256; // hằng lúc biên dịch
Namespaces
namespace math { double pi = 3.14159; } using namespace std; // dùng cẩn thận using std::cout; // ưu tiên chọn lọc
Classes
Định Nghĩa Class
class Rectangle { double w_, h_; public: Rectangle(double w, double h) : w_(w), h_(h) {} double area() const { return w_ * h_; } };
Kế Thừa
class Shape { public: virtual double area() const = 0; // pure virtual virtual ~Shape() = default; }; // class Circle : public Shape { ... };
Access Specifiers
publicTruy cập từ bất kỳ đâu
protectedTruy cập trong class và class dẫn xuất
privateChỉ truy cập trong class
friendCấp quyền cho hàm hoặc class cụ thể
Member Đặc Biệt
ConstructorMyClass(args) — khởi tạo object
Destructor~MyClass() — dọn dẹp tài nguyên
Copy ctorMyClass(const MyClass&)
Move ctorMyClass(MyClass&&) — chuyển quyền sở hữu
Copy assignoperator=(const MyClass&)
Move assignoperator=(MyClass&&)
Templates
Function Template
template T max_val(T a, T b) { return (a > b) ? a : b; } auto result = max_val(3, 7); // suy luận thành int
Class Template
template class Stack { std::vector data_; public: void push(const T& v) { data_.push_back(v); } };
Concepts (C++20)
template concept Numeric = std::integral || std::floating_point; template T add(T a, T b) { return a + b; }
STL Containers
Sequence Containers
vector<T>Mảng động, truy cập ngẫu nhiên nhanh
deque<T>Hàng đợi hai đầu
list<T>Danh sách liên kết đôi
array<T,N>Mảng kích thước cố định (xác định lúc biên dịch)
forward_list<T>Danh sách liên kết đơn
Associative Containers
map<K,V>Cặp key-value có thứ tự (cây đỏ-đen)
set<T>Phần tử duy nhất có thứ tự
unordered_map<K,V>Hash map, tra cứu O(1) trung bình
unordered_set<T>Hash set, tra cứu O(1) trung bình
multimap<K,V>Có thứ tự, cho phép key trùng lặp
Thao Tác Vector
std::vector v = {1, 2, 3}; v.push_back(4); v.emplace_back(5); // construct tại chỗ v.size(); v.empty(); v[0]; v.at(0); // at() kiểm tra biên
Iterators & Algorithms
Sử Dụng Iterator
std::vector v = {3, 1, 4, 1, 5}; for (auto it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; } for (const auto& val : v) { } // range-based for
Các Algorithm Thường Dùng
sort(begin, end)Sắp xếp tăng dần
find(begin, end, val)Tìm lần xuất hiện đầu tiên
count(begin, end, val)Đếm số lần xuất hiện
transform(b, e, out, fn)Áp dụng hàm cho mỗi phần tử
accumulate(b, e, init)Tổng hợp phần tử (tổng mặc định)
reverse(begin, end)Đảo ngược thứ tự phần tử
unique(begin, end)Xóa phần tử liên tiếp trùng nhau
Ranges (C++20)
namespace rv = std::views; auto evens = v | rv::filter([](int n){ return n % 2 == 0; }) | rv::transform([](int n){ return n * n; });
Smart Pointers
unique_ptr
auto p = std::make_unique(42); std::cout << *p << std::endl; // tự xóa khi ra khỏi scope // không thể sao chép, chỉ được move
shared_ptr
auto sp = std::make_shared("hello"); auto sp2 = sp; // đếm tham chiếu: 2 std::cout << sp.use_count(); // 2
So Sánh
unique_ptr<T>Sở hữu độc quyền, không overhead
shared_ptr<T>Sở hữu chia sẻ qua đếm tham chiếu
weak_ptr<T>Quan sát không sở hữu của shared_ptr
make_unique<T>()Cách ưu tiên tạo unique_ptr
make_shared<T>()Cách ưu tiên tạo shared_ptr
Lambdas
Cú Pháp Lambda
auto add = [](int a, int b) { return a + b; }; int sum = add(3, 4); // 7
Chế Độ Capture
[x]Capture x theo giá trị (sao chép)
[&x]Capture x theo tham chiếu
[=]Capture tất cả biến dùng theo giá trị
[&]Capture tất cả biến dùng theo tham chiếu
[=, &x]Tất cả theo giá trị, x theo tham chiếu
[this]Capture con trỏ object bao quanh
Lambda với STL
std::vector v = {5, 2, 8, 1}; std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); // giảm dần auto it = std::find_if(v.begin(), v.end(), [](int n) { return n > 3; });
Chuỗi & I/O
std::string
std::string s = "hello"; s += " world"; // nối chuỗi s.substr(0, 5); // "hello" s.find("world"); // 6 (vị trí) s.length(); s.empty();
Chuyển Đổi Chuỗi
std::to_string(42)Số thành chuỗi
std::stoi(s)Chuỗi thành int
std::stod(s)Chuỗi thành double
std::stol(s)Chuỗi thành long
I/O Streams
std::cout << "output" << std::endl; std::cin >> variable; std::getline(std::cin, line);
File I/O
std::ofstream out("file.txt"); out << "hello" << std::endl; std::ifstream in("file.txt"); std::string line; while (std::getline(in, line)) { }
Xử Lý Lỗi
Exceptions
try { throw std::runtime_error("something failed"); } catch (const std::exception& e) { std::cerr << e.what() << std::endl; } catch (...) { /* lỗi không xác định */ }
Exceptions Chuẩn
std::exceptionBase class cho tất cả exception chuẩn
std::runtime_errorLỗi runtime với message
std::logic_errorLỗi logic (vi phạm tiền điều kiện)
std::out_of_rangeIndex hoặc iterator ngoài phạm vi
std::invalid_argumentTham số hàm không hợp lệ
std::bad_allocThất bại cấp phát bộ nhớ
noexcept
void safe_func() noexcept { // đảm bảo không throw } bool can_throw = noexcept(safe_func()); // true
C++ Hiện Đại (17/20)
Structured Bindings (C++17)
std::map m = {{"a", 1}, {"b", 2}}; for (auto& [key, value] : m) { std::cout << key << ": " << value << "\n"; }
std::optional (C++17)
std::optional find(int id) { if (id > 0) return id * 10; return std::nullopt; } auto val = find(3); // has_value() == true
std::variant & std::any (C++17)
std::variant v = "hello"; std::cout << std::get(v); std::any a = 42; int n = std::any_cast(a);
Tính Năng Hiện Đại Quan Trọng
autoSuy luận kiểu cho biến và kiểu trả về
constexprĐánh giá lúc biên dịch
if constexprĐiều kiện lúc biên dịch (C++17)
std::span<T>View không sở hữu dữ liệu liên tiếp (C++20)
std::format()Định dạng kiểu-an toàn (C++20)
co_awaitHỗ trợ coroutine (C++20)