# Chương 8: Thư viện và namespace

```cpp
#include <bits/stdc++.h>

using namespace std;
```

Trong các phần trước, tác giả bỏ qua đến phần chương trình này. Đã đến lúc ta cần tìm hiểu ý nghĩa của 2 dòng code trên.

## 1. Thư viện

Điểm mạnh khiến C++ trở thành một ngôn ngữ phổ biến trong lập trình thi đấu là nó cung cấp nhiều thư viện chứa các hàm làm việc được viết sẵn, ta không cần phải viết lại mà có thể khai báo thư viện và sử dụng. Ví dụ như hàm `MAX(a, b)` được viết trong phần trước, có một hàm có sẵn là `max(a, b)` trong thư viện `algorithm`.

```cpp
#include <tên thư viên>
```

Trên đây là cú khai báo một thư viện và dưới đây là các thư viện thường sử dụng:

* `iostream.h`: ( thư viện này chứa hàm xuất nhập `cout` và `cin`)
* `stdio.h`: ( nó chứa hàm `scanf, printf...`)
* `math.h`: ( nó chứa hàm toán học như `sqrt, abs, ..`)
* `algorithm`: (chứa các hàm thuật toán như `sort, lower_bound, upper_bound, min, max, ..`)
* Các thư viện của STL (được giới thiệu ở phần sau: [Chương 12: STL](/be-tap-code/stl.md))

Vậy vì sao từ đầu đến giờ tác giả chỉ xài thư viện `bits/stdc++.h`? Về cơ bản thì thư viện này chứa mọi thư viện tiêu chuẩn của C++. Do đó chỉ cần khai báo thư viện này ta đã có đủ hết các hàm để làm việc.

### Một số hàm có sẵn tiện lợi

* `min(a, b)` (thư viện `algorithm`): trả về số nhỏ hơn trong 2 số `a, b`; yêu cầu `a` và `b` cùng kiểu dữ liệu.
* `max(a, b)` (thư viện `algorithm`): trả về số lớn hơn trong 2 số `a, b`; yêu cầu `a` và `b` cùng kiểu dữ liệu.
* `swap(a, b)`(thư viện `algorithm`): trao đổi 2 giá trị của `a, b` cho nhau; `a, b` là 2 biến số có cùng kiểu dữ liệu&#x20;
* `lower_bound`(thư viện `algorithm`): hàm chặt nhị phần tìm phần tử đầu tiên của mảng không nhỏ hơn một số cho trước, chi tiết[: http://www.cplusplus.com/reference/algorithm/lower\_bound/](http://www.cplusplus.com/reference/algorithm/lower_bound/)
* `upper_bound` (thư viện `algorithm`): hàm chặt nhị phần tìm phần tử đầu tiên của mảng lớn hơn một số cho trước, chi tiết: <http://www.cplusplus.com/reference/algorithm/upper_bound/>
* `sort` (thư viện `algorithm`) hàm dùng để sắp xếp lại giá trị của một mảng theo một thứ tự xác định: <http://www.cplusplus.com/reference/algorithm/sort/>

## 2. `namepsace`

Xét tình huống trong lớp 12TH có 2 bạn cùng tên Tú, khi muốn gọi phải thêm các thông tin để phân biệt như giới tính, tên đệm, ... Tình huống này cũng xảy ra trong C++, nếu viết một hàm `tu()` mà có thư viện khác cũng có hàm `tu()`, khi đó chúng ta cần phải sử dụng tới `namespace` để phân biệt chúng.

Bạn đọc tự tìm hiểu cách viết `namespace`, tác giả chỉ giới thiệu về `namespace` trong tài liệu này. Khi muốn truy cập một hàm của một `namespace` nào đó thì sử dụng `tên_namespace::tên_hàm`, ví dụ: `std::cout`.

```cpp
#include <bits/stdc++.h>

int main() {
    std::cout << 69;
}
```

```cpp
69
```

Để gọn hơn nữa thì C++ hỗ trợ sử dụng: `using namespace x` (`x` là tên namespace), khi đó bắt đầu từ lệnh này trở đi, nếu chỉ viết tên hàm thì C++ tự mặc định hàm này là của namespace `x`.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://thnd.gitbook.io/be-tap-code/thu-vien-va-namespace.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
