transform算法:用來做轉(zhuǎn)換的
一元轉(zhuǎn)化:是對容器給定范圍內(nèi)的所有元素做某種一元運(yùn)算后放在另一個(gè)容器內(nèi)。
有4個(gè)參數(shù),前2個(gè)指定要轉(zhuǎn)換容器的起止范圍,第3個(gè)參數(shù)是結(jié)果存放容器的起始位置,第4個(gè)是一元運(yùn)算
函數(shù)簽名是;
template<class InputIterator,class OutputIterator,class UnaryFunction>
transform(InputIterator fisrt,Inputlterator last,OutputIterator result,UnaryFunction op){
for(;first!=last;++first,++result){
*result=op(*first);
return result;
}
}
具體例子
//從標(biāo)準(zhǔn)輸入流中讀取幾個(gè)實(shí)數(shù),分別將他們的平方和輸出
#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;
double squre(double x) {
return x * x;
}
int main() {
transform(istream_iterator<double>(cin), istream_iterator<double>(), ostream_iterator<double>(cout, "\t"), squre);
cout << endl;
return 0;
}
二元轉(zhuǎn)化:是對容器給定范圍內(nèi)的所有元素做某種二元運(yùn)算后放在另一個(gè)容器內(nèi)。
有5個(gè)參數(shù),前2個(gè)指定要轉(zhuǎn)換的第1個(gè)容器的起止范圍,第3個(gè)參數(shù)是指定第2個(gè)要轉(zhuǎn)換容器的開始位置(第一個(gè)容器的結(jié)束位置要小于等于第二個(gè)的結(jié)束位置),第5個(gè)是二元運(yùn)算
函數(shù)簽名是;
template<class InputIterator1,class InputIterator2,class OutputIterator,class BinartFunction>
transform(InputIterator1 fisrt1,Inputlterator1 last1,Inputlterator2 first1,OutputIterator result,BinartFunction op){
具體例子
//相加
#include<iostream>
#include<iterator>
#include<algorithm>
#include<vector>
using namespace std;
double add(double x,double y) {
return (x+y);
}
int main() {
vector<double>s1 = { 1,2,3 };
transform(istream_iterator<double>(cin), istream_iterator<double>(), s1.begin(),ostream_iterator<double>(cout, "\t"), add);
cout << endl;
return 0;
}
綜合運(yùn)用幾種迭代器
#include<algorithm>
#include<iostream>
#include<iterator>
#include<vector>
using namespace std;
//mysort算法進(jìn)行排序
template<class T, class InputIterator, class OutputIterator>
void mySort(InputIterator first, InputIterator last, OutputIterator result) {
vector<T>s;
for (; first != last; ++first)
s.push_back(*first);
sort(s.begin(), s.end());
copy(s.begin(), s.end(), result);
}
int main() {
double a[5] = { 1.2, 2.4, 0.8, 3.3, 3.2 };
//函數(shù)模板可以顯示聲明模板參數(shù)
mySort<double>(a, a + 5, ostream_iterator<double>(cout," "));
cout << endl;
//從標(biāo)準(zhǔn)輸入流讀取若干整數(shù),將排序后的結(jié)果輸出
mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
}
容器
https://blog.csdn.net/weixin_43691058/article/details/88556471
#include<iostream>
#include<list>
#include<deque>//雙端隊(duì)列
#include <iterator>
using namespace std;
template<class T>
void printContainer(const char* msg, const T& s) {
cout << msg << ":";
copy(s.begin(), s.end(), ostream_iterator<int>(cout, " "));
cout<<endl;
}
int main() {
deque<int>s;
for (int i = 0; i < 10; i++) {
int x;
cin >> x;
//s.push_front()//頭插
s.push_back(x);//尾插
}
printContainer("deque at first",s);
list<int>l(s.rbegin(), s.rend());
printContainer("list at first", l);
//聲明指向list<int>的迭代器
list<int>::iterator iter = l.begin();
while (iter != l.end()) {
int v = *iter;
iter = l.erase(iter);//刪除當(dāng)前元素,返回值是被刪除的當(dāng)前元素的下一個(gè)元素,例如9 0 刪除9后返回值指向0
l.insert(++iter, v);//在當(dāng)前元素的后一個(gè)位置插入被刪除的元素 0 后面插入9
}
printContainer("list at last", l);
s.assign(l.begin(), l.end());//賦值
printContainer("deque at last", s);
return 0;
}
向量vector
特點(diǎn)
- 一個(gè)可擴(kuò)展的動(dòng)態(tài)數(shù)組
- 隨機(jī)訪問、尾部插入和刪除元素較快
- 在中間和頭部插入和刪除慢
雙端隊(duì)列deque
特點(diǎn)
- 兩端插入和刪除元素快
- 中間插入和刪除元素慢
- 隨機(jī)訪問較快,但比向量的慢( s[],S容器類型)
//雙端隊(duì)列隊(duì)列
#include<iostream>
#include<deque>
#include<vector>//雙端隊(duì)列
#include <iterator>
#include<algorithm>
using namespace std;
int main() {
istream_iterator<int>i1(cin), i2;//輸入流迭代器 i1起始位置 i2終點(diǎn)
vector<int>s1(i1, i2);//通過輸入流迭代器構(gòu)建vector容器
sort(s1.begin(), s1.end());//排序算法,將該容器內(nèi)的元素進(jìn)行排序
deque<int>s2;
//從大到小輸出奇數(shù),從小到大輸出偶數(shù)
for (vector<int>::iterator iter = s1.begin(); iter != s1.end(); ++iter) {
if (*iter % 2 == 0)
s2.push_back(*iter);
else
s2.push_front(*iter);
}
//將s2的結(jié)果輸出 ctr1+z表示輸入結(jié)束
copy(s2.begin(), s2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
列表
特點(diǎn)
- 在任意位置插入和刪除元素都比較快
- 不支持隨機(jī)訪問
接合(splice)操作
s1.splice(p,s2,q1,q2);//將s2中的[q1,q2)移動(dòng)到s1的p所指向的元素之前之前
//p q1 q2都是迭代器 s1和s2是列表
注意是移動(dòng)元素,而不是拷貝一份副本到被接合的容器中,移動(dòng)后s1和s2中的元素都發(fā)生了變化
#include<iostream>
#include<list>
#include<string>
#include <iterator>
#include<algorithm>
using namespace std;
int main() {
string name1[] = { "Alice", "Helen","Lucy","Susan" };
string name2[] = { "Bob","David","Levin","Mike" };
list<string>s1(name1, name1 + 4);//左閉右開
list<string>s2(name2, name2 + 4);
//將s1的第一個(gè)元素放到s2之后
s2.splice(s2.end(), s1, s1.begin());//元素移動(dòng)
list<string>::iterator iter1 = s1.begin();
advance(iter1, 2);//前進(jìn)兩個(gè)位置
list<string>::iterator iter2 = s2.begin();
++iter2;
list<string>::iterator iter3 = iter2;
advance(iter3, 2);
s1.splice(iter1, s2, iter2, iter3);
copy(s1.begin(), s1.end(), ostream_iterator<string>(cout, " "));
cout << endl;
copy(s2.begin(), s2.end(), ostream_iterator<string>(cout, " "));
cout << endl;
}
set
#include<iostream>
#include<set>
#include<string>
#include<iterator>
#include<utility>//pair make_pair
using namespace std;
int main() {
set<double>s;
while (true) {
double v;
cin >> v;
if (v == 0) {
break;
}
pair < set<double>::iterator, bool > t = s.insert(v);
if (!t.second) {
cout << v << "is duplicated" << endl;
}
}
set<double>::iterator iter1 = s.begin();
set<double>::iterator iter2 = s.end();
double medium = (*iter1 + *(--iter2)) / 2;//容器都是左閉右開,最后一個(gè)元素是end前面一個(gè)元素
copy(s.begin(), s.upper_bound(medium), ostream_iterator<double>(cout, " "));//upper_bound(val)第一個(gè)大于val的元素的位置迭代器
copy(s.lower_bound(medium), s.end(), ostream_iterator<double>(cout, " "));//lower_bound(val)第一個(gè)大于等于val的元素位置迭代器
}
map
#include<iostream>
#include<map>
#include<string>
#include<utility>//pair make_pair
using namespace std;
int main() {
map<string, int>courses;
//三種不同的插入方式
courses.insert(make_pair("C++", 2));
courses["OS"] = 5;
courses.insert(pair<string, int>("COMPILER", 4));
int n = 3;
int sum = 0;
while (n) {
string name;
cin >> name;
map<string, int>::iterator iter = courses.find(name);//鍵值作為關(guān)鍵字
if (iter == courses.end()) {
cout << name << " is not available" << endl;
}
else {
sum += iter->second;
courses.erase(iter);
n--;
}
}
cout << "Total credit" << sum << endl;
return 0;
}
multimap
#include<iostream>
#include<map>
#include<string>
#include<iterator>
#include<utility>//pair make_pair
using namespace std;
int main() {
multimap<string, string>courses;
typedef multimap<string, string>::iterator CourseIter;
courses.insert(make_pair("a", "1-1"));
courses.insert(make_pair("b", "2-1"));
courses.insert(make_pair("b", "2-1"));
courses.insert(make_pair("a", "3-1"));
courses.insert(make_pair("a", "4-1"));
string name;
int count;
do {
cin >> name;
count = courses.count(name);//count返回值是一個(gè)int類型表示出現(xiàn)次數(shù),find返回值是一個(gè)指向出現(xiàn)位置的迭代器
if (count == 0)
cout << "cannot find this course" << endl;
} while (count == 0);
cout << count << "per week" << endl;
//兩種方法都是等效的,equal_range=[lower_bound,upper_bound)
//pair<CourseIter, CourseIter>range = courses.equal_range(name);
multimap<string, string>::iterator iter1 = courses.lower_bound(name);
multimap<string, string>::iterator iter2 = courses.upper_bound(name);
//for (CourseIter iter1 = range.first; iter1 != range.second; ++iter1)
for (; iter1 != iter2; ++iter1)
cout << iter1->second << " ";
cout << endl;
return 0;
}
函數(shù)對象
行為類似于函數(shù)的對象
https://www.cnblogs.com/lzy820260594/p/11398661.html
函數(shù)適配器(函數(shù)對象的適配器)

image.png