一、transform是什麼:
在C++標準庫中,transform函數是一個非常實用的演算法。它可以將一個給定的範圍(一個或多個容器)的每個元素應用到一個函數,並將該函數的結果存儲在另一容器中,或者覆蓋當前範圍。 代碼如下:
template OutputIterator transform (InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperator op);
其中,first1和last1構成了一個區間,稱為源區間,表示一個向量或數組。result指向存儲器中的目標序列,是另一個向量或數組。op是轉換操作函數的對象。此函數的任務是將[first1,last1]內的每個元素轉換為op(*i),其中i是[first1,last1]所覆蓋區間的指向成員的迭代器。
二、transform與lambda表達式:
在應用transform函數時,我們可以使用lambda表達式作為操作函數。 Lambda表達式是一種C++的函數表示方式,它可以定義小型匿名函數。即變數可以在lambda函數中定義,在不用命名這些變數的情況下,可以給它們附加一個函數(或操作符)來作為匿名函數體。 例如:
std::vector from{1,2,3,4,5}; std::vector to(from.size()); std::transform(from.begin(), from.end(), to.begin(), [](int i){ return i * 2 ; });
這個例子中,lambda表達式[](int i) { return i * 2;}作為transform的第三個參數被傳遞。transform函數會取from序列中的每個元素,將它們傳遞給lambda表達式,並把返回結果賦值給to序列中相應位置的元素。在這個例子中,最終的結果將是to = [2,4,6,8,10]。這證明了,通過transform函數,我們可以輕鬆地使用lambda表達式對向量進行操作。
三、transform與自定義函數:
在使用transform函數時,我們還可以使用用戶自定義的函數作為操作函數。在使用自定義函數時,需要實現相應的轉換操作,以及確定第三個參數(目標序列存儲器)的類型。以下是一個將浮點數圓整為整數的示例:
#include #include #include #include int round_to_int(double x) { return static_cast(std::round(x)); } int main() { std::vector v{1.0, 2.2, 3.5, 4.7, 9.0}; std::vector result(v.size()); std::transform(v.begin(), v.end(), result.begin(), round_to_int); // result: [1, 2, 4, 5, 9]; for(auto i : result) { std::cout << i << " "; } std::cout<<std::endl; return 0; }
在本例中,我們向transform函數傳遞了一個指向轉換函數round_to_int的指針。函數round_to_int接收一個浮點數,將其四捨五入,返回相應的整數。函數指針作為操作函數的參數。元素被取自v序列,存儲在result序列中。 根據操作的特點以及需要的結果類型,我們選擇了使用int類型的序列作為結果序列存儲器。
四、transform與多個容器:
最後,transform函數可以處理多個容器。如果提供了多個源和目標序列,則在指定操作函數時應該使用並置二元函數。此時傳遞的函數接受兩個參數,分別是容器中的對應元素,而不是像unary_function接受的單個值。 下面是一個使用二進位函數操作兩個向量的簡單示例:
#include #include #include int sum(int x, int y) { return x + y; } int main() { std::vector v1 { 1, 2, 3, 4, 5 }; std::vector v2 { 1, 1, 2, 2, 3 }; std::vector result(v2.size()); std::transform(v1.begin(), v1.end(), v2.begin(), result.begin(), sum); for(auto i : result) { std::cout << i << " "; } std::cout<<std::endl; return 0; }
在這個例子中,我們有兩個容器v1和v2分別包含整數的元素,在transform函數中傳遞了一個求和函數,將結果存儲在相應位置的另一個容器中。在函數sum中,我們將兩個相對應的參數相加並返回結果。最後的結果是result = [2, 3, 5, 6, 8]。
總結:
本文介紹了C++標準庫中的一個非常實用的演算法——transform函數。我們詳細討論了transform函數的相關應用,包括使用lambda表達式和自定義函數完成轉換任務,以及如何操作多個容器。 類似於lambda表達式的功能,transform函數使代碼變得更短、更清晰,可讀性更高。通過更深入地學習及實踐,transform函數可以幫助開發者提高工作效率,使代碼量更少但實現同樣的功能。
原創文章,作者:FBEUT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/370244.html