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 對區間裡每個元素執...