??STL容器算法主要由、、組成;
??algorithm主要有遍歷、比較、交換、查找、拷貝、修改等;
1.遍歷容器for_each
??for_each()函數用于完成容器遍歷,函數參數如下:
for_each(_InIt _First, _InIt _Last, _Fn _Func)
形參:_First、_Last --容器的起始和結束迭代器_Func -->仿函數(回調函數),處理要輸出的信息
1.1 vector容器遍歷
??自定義數據格式:
class Person
{friend class mycompare;friend class Myprint;//友元類friend void Print(const Person& p);//友元函數
public:Person() {}Person(string name, int age) :name(name), age(age) {}Person(const Person& p){name = p.name;age = p.age;}bool operator<(const Person& p)const{if (this->age == p.age){return p.name < p.name;}return this->age > p.age;}
private:string name;int age;
};
void Print(const Person& p)
{cout << "姓名:" << p.name << "\t年齡:" << p.age << endl;
}
class Myprint
{
public:void operator()(const Person& p){cout << "姓名:" << p.name << "\t年齡:" << p.age << endl;}void operator()(const pair<Person, int>& p){cout << "姓名:" << (p.first).name << "\t年齡:" << (p.first).age << "\t成績:" << p.second << endl;}
};
class mycompare
{
public:bool operator()(const Person& p1,const Person& p2)const{if (p1.age == p2.age){return p1.name < p2.name;}return p1.age > p2.age;}
};
void vector_test()
{cout << "\tvector容器示例:" << endl;//創建vector容器--->單端數組vector<Person>vtr;vtr.push_back(Person("小王", 18));vtr.push_back(Person("小林", 18));vtr.push_back(Person("小李", 18));vtr.push_back(Person("小劉", 18));cout << "提供一個函數示例:" << endl;for_each(vtr.begin(), vtr.end(), Print);cout << "提供一個仿函數示例:" << endl;for_each(vtr.begin(), vtr.end(), Myprint());
}
1.2 list容器遍歷
void list_test()
{//創建一個list容器-->雙向鏈表cout << "\tlist容器示例:" << endl;list<Person> t;t.push_back(Person("小王", 18));//尾插t.push_front(Person("小林", 18));//頭插t.push_back(Person("小李", 18));t.push_back(Person("小劉", 18));cout << "提供一個仿函數示例:" << endl;for_each(t.begin(), t.end(), Myprint());
}
1.3 set容器遍歷
void set_test()
{cout << "\tset/multiset關聯式容器:" << endl;multiset<Person>mt;//該容器會自動排序mt.insert(Person("小王", 18));mt.insert(Person("小林", 18));mt.insert(Person("小李", 17));mt.insert(Person("小劉", 18));mt.insert(Person("小李", 22));for_each(mt.begin(), mt.end(), Myprint());cout << "\tset/multiset關聯式容器(仿函數示例):" << endl;multiset<Person, mycompare>mt2;mt2.insert(Person("小王", 18));mt2.insert(Person("小林", 18));mt2.insert(Person("小李", 17));mt2.insert(Person("小劉", 18));mt2.insert(Person("小李", 22));for_each(mt.begin(), mt.end(), Myprint());
}
1.4 map容器遍歷
void map_test()
{cout << "\tmap關聯式容器示例:" << endl;multimap<Person, int>mp;mp.insert(make_pair(Person("小王", 18), 88));mp.insert(pair<Person,int>(Person("小林", 18),99));mp.insert(pair<Person, int>(Person("小李", 17), 95));mp.insert(pair<Person, int>(Person("小劉", 18), 95));mp.insert(pair<Person, int>(Person("小李", 22), 90));for_each(mp.begin(), mp.end(), Myprint());
}
1.5 整體運行效果
int main()
{vector_test();//vector容器list_test();//list容器set_test();//set容器map_test();//map容器system("pause");
}
2.轉移元素transform
transform函數:transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)將一個函數中的元素拷貝到另一個容器中,_First、_Last --要轉移的容器的起始迭代器和結束迭代器_Dest --目標容器的起始迭代器_Func --仿函數,支持一元運算,可以對當前值進行+ - * 等各種運算
- 使用示例:
#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
/*
transform函數:transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)將一個函數中的元素拷貝到另一個容器中,_First、_Last --要轉移的容器的起始迭代器和結束迭代器_Dest --目標容器的起始迭代器_Func --仿函數,支持一元運算,可以對當前值進行+ - * \ 等各種運算
*/
class myprint
{
public:void operator()(int val){cout << val << " ";}
};
class myfunc
{
public:int operator()(int val1){return val1;}
};void test()
{vector<int>t1;for (int i = 0; i < 10; i++){int temp = rand() % 101;t1.push_back(temp);}cout << "原容器數據:" << endl;for_each(t1.begin(), t1.end(), myprint());cout << endl;vector<int>target;target.resize(t1.size());//設置target容器大小transform(t1.begin(), t1.end(), target.begin(), myfunc());cout << "轉移后的容器內容:" << endl;for_each(target.begin(), target.end(), myprint());cout << endl;
}
int main()
{test();system("pause");
}