C++ hiện đại và cách làm tương ứng trong C

Container và thuật toán STL trong C++

Trong bài học này, bạn sẽ so sánh việc tự viết vòng lặp xử lý mảng trong C với cách kết hợp các thuật toán có sẵn của thư viện chuẩn C++.

Giới thiệu

Thư viện chuẩn C++ (STL) cung cấp nhiều container như vector và rất nhiều thuật toán có sẵn như lọc, tính tổng, sắp xếp. Các thuật toán này làm việc trên một khoảng iterator, nhờ đó tách biệt thao tác xử lý khỏi cách dữ liệu được lưu trữ.

Những điểm quan trọng

  • Hiểu cách làm trong C trước khi học các công cụ trừu tượng của C++.
  • Dùng RAII và ngữ nghĩa giá trị (value semantics) để thể hiện quyền sở hữu tài nguyên.
  • Ưu tiên các công cụ an toàn kiểu của C++ thay vì macro và ép kiểu.

Code ví dụ bằng C và C++

C
Chạy code →
main.c
#include <stdio.h>

int main(void) {
    int values[] = {3, 8, 2, 7, 6};
    int even[5];
    int count = 0;
    int sum = 0;
    for (int index = 0; index < 5; ++index) {
        if (values[index] % 2 == 0) {
            even[count++] = values[index];
        }
    }
    for (int index = 0; index < count; ++index) {
        sum += even[index];
    }
    printf("count=%d sum=%d\n", count, sum);
}
Kết quả khi chạy
count=3 sum=16
C++
Chạy code →
main.cpp
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

int main() {
    std::vector values{3, 8, 2, 7, 6};
    std::vector<int> even;
    std::copy_if(values.begin(), values.end(),
                 std::back_inserter(even),
                 [](int value) { return value % 2 == 0; });
    std::cout << "count=" << even.size()
              << " sum="
              << std::accumulate(even.begin(), even.end(), 0) << '\n';
}
Kết quả khi chạy
count=3 sum=16

So sánh C và C++

Phiên bản C phải tự viết mọi vòng lặp và tự quản lý kích thước mảng even để lọc số chẵn rồi tính tổng. Phiên bản C++ kết hợp std::copy_if để lọc và std::accumulate để tính tổng trên vector. Code ngắn gọn và dễ tái sử dụng hơn, trong khi độ phức tạp vẫn rõ ràng như khi tự viết.

C

C dùng quy ước đặt tên, callback, macro và struct chứa ngữ cảnh.

C++

C++ có sẵn các công cụ trừu tượng có phạm vi rõ ràng, an toàn kiểu và thường không tốn thêm chi phí khi chạy.

Bài tập mở rộng

Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.

  • Tự viết cơ chế bằng C trước, rồi mới dùng tính năng tương ứng của C++.
  • Thay việc giải phóng tài nguyên thủ công bằng RAII.
  • Kiểm tra xem tính năng có phát sinh cấp phát bộ nhớ hoặc lời gọi hàm ảo hay không.

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách