(6)STL演算法之轉換

2021-10-14 10:37:49 字數 2887 閱讀 2414

2、轉換

函式transform()實現了將源區間的元素複製到目標區間,也可以修改元素、合併兩個區間。

//對源區間 [first1,last1]的每乙個元素均呼叫函式 op(elem) ,結果寫入以result為起始位置的目標區間,函式返回值是最後乙個被轉換元素的下一位置。 

template outputiterator transform (inputiterator first1, inputiterator last1,outputiterator result, unaryoperation op);

//對源區間 [first1,last1]的每乙個元素,和first2開始的第二個源區間的對應元素呼叫函式或者規則 op(elem1,elem2) ,結果寫入以result為起始位置的目標區間,函式返回值是最後乙個被轉換元素的下一位置。 需要注意的是第二源區間需要有足夠的空間,至少和第一源區間一樣大

template outputiterator transform (inputiterator1 first1, inputiterator1 last1,inputiterator2 first2, outputiterator result,binaryoperation binary_op);

template outputiterator transform (inputiterator first1, inputiterator last1,outputiterator result, unaryoperator op)

return result;

}// 對於以上兩種,都需要目標區間有足夠空間,否則就需要使用 插入行迭代器

對於以上兩種形式,都需要目標區間有足夠空間,否則就需要使用  插入行迭代器。

用法示例:

#include #include #include #include #include #include using namespace std;

void print(int& ele)

void main()

; vectorv1;

listl2, l3;

v1.assign(arr, arr + 9);

cout << "vector v1: ";

for_each(v1.begin(), v1.end(), print);

cout << endl;

//l2中的元素分別取反(negate),以下用到了許多仿函式

transform(v1.begin(), v1.end(), back_inserter(l2), negate());

cout << "list l2*(-1): ";

for_each(l2.begin(), l2.end(), print);

cout << endl;

//l2中的元素分別乘(multiplies)以10

transform(l2.begin(), l2.end(), l2.begin(), bind2nd(multiplies(), 10));

cout << "list l2(*10): ";

for_each(l2.begin(), l2.end(), print);

cout << endl;

cout << "list l2(-): ";// 逆序並取反(negate)

transform(l2.rbegin(), l2.rend(), ostream_iterator(cout, ", "), negate());

cout << endl;

cout << "list l2(/2, reverse_direction): ";// 除(divide)

transform(l2.rbegin(), l2.rend(), ostream_iterator(cout, ", "), bind2nd(divides(), 2));

cout << endl;

//以上是第一種形式的用法

cout << "list l2: ";

for_each(l2.begin(), l2.end(), print);

cout << endl;

cout << "list l2(*v1): ";

transform(v1.begin(), v1.end(), l2.begin(), l2.begin(), multiplies());

copy(l2.begin(), l2.end(), ostream_iterator(cout, ", "));

cout << endl;

cout << "list l2(squared): ";

//l2中的元素沒有變化

transform(l2.begin(), l2.end(), l2.begin(), ostream_iterator(cout, ", "), multiplies());

cout << endl;

cout << "list l2: ";

for_each(l2.begin(), l2.end(), print);

cout << endl;

cout << "l3( v1+l2 ): ";

transform(v1.begin(), v1.end(), l2.begin(), back_inserter(l3), plus());

for_each(l3.begin(), l3.end(), print);

cout << endl;

cout << "cout (l2-l3) : ";

//l2、l3中的元素沒有變化

transform(l2.begin(), l2.end(), l3.begin(), ostream_iterator(cout, ", "), minus());

cout << endl;

}

演算法筆記6 STL

它可以理解為乙個可變陣列,長短可變。string與vector支援迭代器 a,訪問 特點 自動去重 遞增排序 1 直接相加減 2 直接用 比較,規則 字典序 3 length 4 insert pos,string pos的範圍 0,length 1 string str xyzw str.inse...

STL之演算法

演算法是指解決問題的方 而完整的描述,對於規範的輸入,在有限時間內要獲得所需要的輸出。不同的演算法可能使用不同的時間 空間或效率完成同樣的任務。想要評估乙個演算法的好壞,目前可以通過時間複雜度和空間複雜度來進行衡量。時間複雜度,是指演算法執行指令所需的計算量。演算法的執行時間和其所要處理的資料之間存...

STL演算法之for each

轉接自stl演算法 for each 對區間裡每個元素執行相應操作 注 for each 接受乙個操作,操作可改動所接受實參 所以該實參必須以by reference方式傳遞 include include include using namespace std for each 對區間裡每個元素執...