Trình bày vài nét về chế độ phân biệt chủng tộc ở Châu Phi
Chương trình C++ sau đây nhập vào số nguyên n và dãy số A1, A2, ..., An, loại bỏ các phần tử giống nhau trong dãy và in ra dãy kết quả sử dụng `std::map`. Lưu ý rằng `std::map` tự động sắp xếp các khóa (trong trường hợp này là các phần tử của dãy), nên thứ tự các phần tử trong dãy đầu ra có thể khác với dãy đầu vào. Nếu cần giữ nguyên thứ tự, bạn nên sử dụng `std::unordered_map`.
```cpp
#include <iostream>
#include <map>
using namespace std;
int main() {
int n;
cout << "Nhập số lượng phần tử n: ";
cin >> n;
map<int, int> count; // Sử dụng map để đếm số lần xuất hiện của mỗi phần tử
int a;
cout << "Nhập các phần tử của dãy: ";
for (int i = 0; i < n; ++i) {
cin >> a;
count[a]++; // Tăng số lần xuất hiện của phần tử a
}
cout << "Dãy sau khi loại bỏ phần tử trùng lặp: ";
for (auto const& [key, val] : count) {
cout << key << " "; // In ra các khóa (phần tử duy nhất)
}
cout << endl;
return 0;
}
```
**Giải thích:**
1. **`#include <iostream>`:** Thêm thư viện đầu vào/xuất.
2. **`#include <map>`:** Thêm thư viện `map`.
3. **`map<int, int> count;`:** Khai báo một `map` có khóa là kiểu `int` (phần tử của dãy) và giá trị là kiểu `int` (số lần xuất hiện).
4. **`count[a]++;`:** Mỗi khi gặp một phần tử `a`, tăng giá trị tương ứng trong `map` lên 1. Nếu `a` chưa có trong `map`, nó sẽ được thêm vào với giá trị 1.
5. **`for (auto const& [key, val] : count)`:** Duyệt qua `map`. `key` là phần tử của dãy, `val` là số lần xuất hiện. Chỉ cần in ra `key` để có được dãy không trùng lặp.
**Ví dụ:**
Nếu nhập vào:
`n = 7`
`A = {1, 2, 2, 3, 4, 4, 4}`
Kết quả đầu ra sẽ là:
`Dãy sau khi loại bỏ phần tử trùng lặp: 1 2 3 4 `
**Để giữ nguyên thứ tự:**
Nếu bạn cần giữ nguyên thứ tự các phần tử trong dãy đầu ra, bạn cần sử dụng `std::unordered_map` và một `vector` để lưu trữ các phần tử duy nhất theo thứ tự ban đầu. Đây là một ví dụ:
```cpp
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
// ... (nhập n và dãy A như trên) ...
unordered_map<int, int> seen;
vector<int> unique_elements;
for (int i = 0; i < n; ++i) {
if (seen.find(a) == seen.end()) {
seen[a] = 1;
unique_elements.push_back(a);
}
}
cout << "Dãy sau khi loại bỏ phần tử trùng lặp (giữ nguyên thứ tự): ";
for (int element : unique_elements) {
cout << element << " ";
}
cout << endl;
return 0;
}
```
Phiên bản này sử dụng `unordered_map` để kiểm tra nhanh chóng xem một phần tử đã được gặp trước đó hay chưa và `vector` để lưu trữ các phần tử duy nhất theo thứ tự xuất hiện ban đầu.
#include <iostream>
#include <map>
using namespace std;
int main() {
int n;
cout << "Nhập vào số lượng phần tử n: ";
cin >> n;
map<int, int> m;
cout << "Nhập vào dãy số A1, A2, ..., An:" << endl;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
m[x] = 1;
}
cout << "Dãy số sau khi loại bỏ phần tử trùng lặp: ";
for (auto& pair : m) {
cout << pair.first << " ";
}
cout << endl;
return 0;
}