Chuyển tới nội dung chính

std::transform

#include <algorithm>

// Unary Operation - Thao tác một ngôi
template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperation op);

// Binary Operation - Thao tác hai ngôi
template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperation binary_op);

Áp dụng một hàm (hoặc đối tượng hàm) cho mỗi phần tử trong một phạm vi (range) đầu vào và lưu trữ kết quả vào một phạm vi đầu ra. Nó có thể được sử dụng để thay đổi giá trị của các phần tử trong một container, hoặc để tạo ra một container mới dựa trên các giá trị đã biến đổi từ container ban đầu.

Tham số

first1

  • Input Iterator trỏ đến phần tử đầu tiên trong phạm vi đầu vào thứ nhất.

last1

  • Input Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi đầu vào thứ nhất. Phạm vi đầu vào thứ nhất là [first1, last1).

first2

  • Input Iterator trỏ đến phần tử đầu tiên trong phạm vi đầu vào thứ hai. (Phiên bản 2)

result

  • Output Iterator trỏ đến phần tử đầu tiên trong phạm vi đầu ra nơi các kết quả biến đổi sẽ được lưu trữ.

op

  • Một hàm hoặc đối tượng hàm (unary operation) nhận một đối số (một phần tử từ phạm vi đầu vào) và trả về giá trị đã biến đổi. (Phiên bản 1)

binary_op

  • Một hàm hoặc đối tượng hàm (binary operation) nhận hai đối số (một phần tử từ phạm vi đầu vào thứ nhất và một phần tử từ phạm vi đầu vào thứ hai) và trả về giá trị đã biến đổi. (Phiên bản 2)

Giá trị trả về

  • Output Iterator trỏ đến phần tử ngay sau phần tử cuối cùng được ghi trong phạm vi đầu ra.

Đặc điểm

  1. Phạm vi đầu vào [first1, last1) là "nửa mở", không bao gồm phần tử last1.
  2. Phạm vi đầu ra phải có đủ không gian để chứa các kết quả. Bạn có thể sử dụng std::back_inserter để thêm các phần tử vào cuối container đầu ra nếu cần.
  3. Phạm vi đầu vào và đầu ra có thể trùng nhau (thay đổi giá trị tại chỗ).
  4. Trong C++11 trở lên, sử dụng biểu thức lambda cho các hàm op hoặc binary_op thường ngắn gọn và dễ đọc hơn.
  5. transform() thường được sử dụng để:
    • Biến đổi các phần tử trong một container (ví dụ: chuyển đổi tất cả các ký tự trong chuỗi thành chữ hoa, bình phương các số trong một vector).
    • Kết hợp hai container thành một container mới dựa trên một phép toán (ví dụ: cộng hai vector với nhau, tìm giá trị lớn hơn giữa hai vector).
    • Tạo một container mới từ một container hiện có bằng cách áp dụng một phép biến đổi cho mỗi phần tử.

Ví dụ

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cctype>

// Hàm chuyển đổi ký tự thành chữ hoa
char toUpper(char c) {
return std::toupper(c);
}

// Hàm tính tổng hai số
int add(int a, int b) {
return a + b;
}

int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::vector<int> squares(numbers.size());

// Phiên bản 1: Tính bình phương của mỗi số
std::transform(numbers.begin(), numbers.end(), squares.begin(), [](int n){ return n * n; });

std::cout << "Squares: ";
for (int x : squares) {
std::cout << x << " ";
}
std::cout << std::endl;

std::string str = "hello world";
std::string upperStr(str.size(), ' '); // Tạo chuỗi rỗng với kích thước bằng str

// Phiên bản 1: Chuyển đổi chuỗi thành chữ hoa sử dụng con trỏ hàm
std::transform(str.begin(), str.end(), upperStr.begin(), toUpper);

std::cout << "Uppercase string: " << upperStr << std::endl;

std::vector<int> numbers2 = {5, 4, 3, 2, 1};
std::vector<int> sums(numbers.size());

// Phiên bản 2: Tính tổng từng cặp phần tử tương ứng
std::transform(numbers.begin(), numbers.end(), numbers2.begin(), sums.begin(), add);

std::cout << "Sums: ";
for (int x : sums) {
std::cout << x << " ";
}
std::cout << std::endl;

return 0;
}

Các hàm liên quan

for_eachÁp dụng một hàm (hoặc đối tượng hàm) cho mỗi phần tử trong một phạm vi được chỉ định
copySao chép các phần tử từ một phạm vi (range) nguồn sang một phạm vi đích khác