STL容器算法主要有:、、組成
algorithm主要有遍歷、比較、交換、查找、拷貝、修改等;
numeric體積很小,主要包括幾個序列上的進行數學運算的函數模板;
functional定義了一些模板類,用于聲明仿函數;
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;
};
//創建函數對象
class Myprint
{
public:
void operator()(const Person& p)
{
cout < "姓名:" < p.name < "t年齡:" < p.age < endl;
}
void operator()(const pair& p)
{
cout < "姓名:" < (p.first).name < "t年齡:" < (p.first).age < "t成績:" < p.second < endl;
}
};
void vector_test()
{
cout < "tvector容器示例:" < endl;
//創建vector容器---?>單端數組
vectorvtr;
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 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;
multisetmt;//該容器會自動排序
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;
multisetmt2;
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;
multimapmp;
mp.insert(make_pair(Person("小王", 18), 88));
mp.insert(pair(Person("小林", 18),99));
mp.insert(pair(Person("小李", 17), 95));
mp.insert(pair(Person("小劉", 18), 95));
mp.insert(pair(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
using namespace std;
#include
#include
class myprint
{
public:
void operator()(int val)
{
cout < val < " ";
}
};
class myfunc
{
public:
int operator()(int val1)
{
return val1;
}
};
void test()
{
vectort1;
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;
vectortarget;
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");
}
3.成員查找
STL中支持多種查找方式。
- find() --查找指定元素
- find_if() --按條件查找
- adjacend_find() --查找相鄰元素
- binary_search() --二分法查找
- count() --統計元素個數
- count_if() --按條件統計
3.1 find查找
find函數:
find(_InIt _First, const _InIt _Last, const _Ty& _Val);
_First、_Last --查找的起始和結束位置
_Val --要查找的內容
返回值:成功返回查找到位置的迭代器
失敗返回end();
#include
using namespace std;
#include
#include
#include
#include
#include
class Person
{
friend class map_compare;
friend class print;
friend ostream& operator<(ostream& cout, const Person& p);
public:
Person(){}
Person(string name, int age):name(name),age(age) {
}
bool operator==(const Person& p)const
{
if (name == p.name && age == p.age)return true;
return false;
}
bool operator(const Person& p)const
{
if (p.age == age)
{
return name < p.name;
}
return age > p.age;
}
private:
string name;
int age;
};
ostream& operator<(ostream& cout, const Person& p)
{
cout < "姓名:" < p.name < "t年齡:" < p.age ;
return cout;
}
class print
{
public:
void operator()(const Person& p) {
cout < "姓名:" < p.name < "t年齡:" < p.age < endl;
}
};
void vec_test()
{
cout < "tvector容器查找示例:" < endl;
vectorvtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小劉", 17));
vtr.push_back(Person("小李", 22));
vtr.push_back(Person("小林", 19));
for_each(vtr.begin(),vtr.end(),print());
vector::iterator ret=find(vtr.begin(), vtr.end(), Person("小劉", 17));
if (ret == vtr.end())
{
cout < "未找到該成員" < endl;
}
else
{
cout < "查找成功: " < endl;
cout < *ret < endl;;
}
}
void list_test()
{
cout < "nlist容器使用示例:" < endl;
listt;
t.push_back(Person("小王", 18));
t.push_front(Person("小劉", 17));
t.insert(t.end(),Person("小王", 18));
t.insert(t.begin(), Person("小王", 18));
t.push_back(Person("小李", 22));
t.push_back(Person("小林", 19));
for_each(t.begin(), t.end(), print());
cout < "查找成員Person("小王", 18)" < endl;
int count = 0;
for (list::iterator ptr = t.begin();ptr != t.end(); )
{
ptr =find(ptr, t.end(), Person("小王", 18));
if (ptr != t.end())
{
cout < "查找到第 " < ++count < "成員:";;
cout < *ptr < endl;
ptr++;
}
}
}
//棧容器
void stack_test()
{
cout < "stack容器查找示例:" < endl;
//stack棧:先進后出
stacks;
s.push(Person("小王", 18));
s.push(Person("小劉", 17));
s.push(Person("小李", 22));
s.push(Person("小林", 19));
s.push(Person("小王", 18));
cout < "元素個數:" < s.size() < endl;
while (!s.empty())//判斷容器是否為空
{
if (s.top() == Person("小王", 18))
{
cout < "查找成功" < endl;
}
s.pop();//出棧
}
}
class map_print
{
public:
void operator()(const pair& p)
{
cout < p.first < "t成績:" < p.second < endl;
}
};
class map_compare
{
public:
bool operator()(const pair& p1, const pair& p2)
{
if (p1.first == p2.first && p1.second == p2.second)return true;
return false;
}
};
//map容器
void multimap_test()
{
cout < "nmap容器查找示例:" < endl;
multimapmp;
//插入數據
mp.insert(pair(Person("小王", 18), 88));
mp.insert(make_pair(Person("小劉", 17), 99));
mp.insert(multimap::value_type(Person("小王", 18), 100));
mp.insert(make_pair(Person("小李", 19), 95));
for_each(mp.begin(), mp.end(), map_print());
cout< "查找成員Person("小王", 18)" < endl;
multimap::iterator ret = mp.find(Person("小王", 18));//查找數據
map_print p;
//multimap容器由于數據都是有序的,所以相同的數據都是連在一起的
for (int i = 0; i < mp.count(Person("小王", 18)); i++, ret++)
{
if (ret != mp.end())
{
p(*ret);
}
}
}
class stu
{
public:
stu() {}
stu(string name, int age) :name(name), age(age) {
}
bool operator==(const stu& p)const
{
if (name == p.name && age == p.age)return true;
return false;
}
bool operator(const stu& p)const
{
if (p.age == age)
{
return name < p.name;
}
return age > p.age;
}
string name;
int age;
};
int main()
{
vec_test();
list_test();
stack_test();
multimap_test();
system("pause");
}
#endif
3.2 find_if條件查找
find_if(_InIt _First, const _InIt _Last, _Pr _Pred)
形參:_First、_Last --查找的起始和結束迭代器
_Pred --仿函數,查找條件
返回值:成功返回查找到的成員的位置迭代器
失敗返回endl
#include
#include
#include
#include
#include
using namespace std;
class Person
{
friend std::ostream& operator<(std::ostream& cout, Person& p);
friend class compare;
friend class print;
public:
Person() {}
Person(std::string name, int age) :name(name), age(age) {
}
bool operator?>(const Person& p)const
{
return age > p.age;
}
private:
std::string name;
int age;
};
std::ostream& operator<(std::ostream& cout, Person& p)
{
cout < "姓名:" < p.name < "t年齡" < p.age;
return cout;
}
class compare
{
public:
bool operator()(const Person& p)
{
return p.age > 18;
}
bool operator()(const Person& p1, const Person& p2)const
{
if (p1.age == p2.age)return p1.name < p2.name;
return p1.age < p2.age;
}
};
class print
{
public:
void operator()(pairp)
{
cout < p.first < "t成績" < p.second < endl;
}
};
void vector_test()
{
cout < "vector容器條件查找示例:" < endl;
std::vector vtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小劉", 17));
vtr.push_back(Person("小李", 22));
vtr.push_back(Person("小林", 19));
std::cout < "查找年齡大于18的成員:" < std::endl;
std::vector::iterator ret=find_if(vtr.begin(), vtr.end(), compare());
if (ret != vtr.end())
{
std::cout < "查找成功" < std::endl;
std::cout < *ret < std::endl;
}
}
void multimap_test()
{
cout < "nmultimap條件查找示例:" < endl;
multimapp;
p.insert(make_pair(Person("小王", 18), 88));
p.insert(make_pair(Person("小劉", 17), 99));
p.insert(make_pair(Person("小劉", 17), 77));
p.insert(make_pair(Person("小林", 17), 77));
p.insert(make_pair(Person("小李", 22), 100));
for_each(p.begin(), p.end(), print());
cout < "查找年齡Person("小劉", 17)" < endl;
pair::iterator,multimap::iterator> ret=p.equal_range(Person("小劉", 17));
for (; ret.first != ret.second;ret.first++)
{
print temp;
temp(*(ret.first));
}
}
int main()
{
vector_test();
multimap_test();
system("pause");
}
3.3 find_if條件查找
adjacent_find() -查找相鄰重復元素,查找成功返回相鄰重復元素的首位置的迭代器,失敗返回end
iterator adjacent_find(const _FwdIt _First, _FwdIt _Last, _Pr _Pred)
形參:_First、_Last --要查找的起始、結束區間迭代器
_Pred --查找條件
返回值:成功返回相鄰重復元素的首位置的迭代器
失敗返回end
示例:
#include
#include
#include
#include
using namespace std;
class Person
{
friend ostream& operator<(ostream& cout, Person& p);
public:
Person(string name, int age) :name(name), age(age) {
}
bool operator==(Person& p)
{
if (p.age == this-?>age && p.name == name)return true;
return false;
}
string name;
int age;
};
ostream& operator<(ostream& cout, Person& p)
{
cout < "姓名:" < p.name < "t年齡:" < p.age;
return cout;
}
class compare
{
public:
bool operator()(const Person& p1, const Person& p2)const
{
if (p1.name == p2.name && p1.age == p2.age)return true;
return false;
}
};
void vector_test()
{
cout < "tvector容器使用示例!" < endl;
vectorvtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小劉", 18));
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小李", 18));
auto ret=adjacent_find(vtr.begin(), vtr.end(), compare());
if (ret != vtr.end())
{
cout < "查找成功:";
cout < *ret < endl;
}
}
class print
{
public:
void operator()( pair p)const
{
cout < p.first < "t成績:" < p.second < endl;
}
};
class mapcompare
{
public:
bool operator()(const Person& p1, const Person& p2)const
{
if ( p1.age == p2.age)return p1.name 17;
}
};
void mulitmap_test()
{
cout < "ntmultimap使用示例!" < endl;
multimapmp;
mp.insert(make_pair(Person("小王", 16), 77));
mp.insert(make_pair(Person("小劉", 18), 88));
mp.insert(make_pair(Person("小劉", 18), 88));
mp.insert(make_pair(Person("小李", 19), 99));
cout < "元素個數:" < mp.size() < endl;
for_each(mp.begin(), mp.end(), print());
auto begin=mp.lower_bound(Person("小劉", 18));
auto end = mp.upper_bound(Person("小劉", 18));
cout < "查找相鄰重復內容Person("小劉", 18):" < endl;
for (; begin != end; begin++)
{
print p;
p(*begin);
}
}
int main()
{
vector_test();
mulitmap_test();
system("pause");
}
3.4 二分法查找binary_search
二分法查找元素:
bool binary_search(val); -->查找成功返回true,失敗返回false,保證數據順序為從小到大
binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val, _Pr _Pred)
形參:_First、_Last --起始和結束迭代器
_Val --要查找的內容
_Pred --數據順序方式(默認從小到大)
注意:調用該函數必須保證有序,否結果可能不準確
#include
#include
#include
#include
using namespace std;
class Print
{
public:
void operator()(int v1)
{
cout < v1 < " ";
}
};
void test()
{
vectorvtr;
vtr.push_back(10);
vtr.push_back(3);
vtr.push_back(6);
vtr.push_back(2);
vtr.push_back(5);
cout < "從小到大排序:" < endl;
sort(vtr.begin(), vtr.end(), less());
for_each(vtr.begin(), vtr.end(), Print());
cout < endl;
auto ret=binary_search(vtr.begin(), vtr.end(), 5);
if (ret)
{
cout < "查找5:查找成功" < endl;
}
}
int main()
{
test();
system("pause");
}
3.5 查找個數count
查找指定成員個數:
count(const _InIt _First, const _InIt _Last, const _Ty& _Val)-->返回查找到的個數
形參:_First、_Last --起始和結束迭代器
_Val --要查找的內容
返回值:返回查找到的個數
示例:
#include
using namespace std;
#include
#include
class Person
{
public:
Person() {}
Person(string name, int age) :name(name), age(age) {
}
bool operator==(const Person p)const
{
if (age == p.age && name == p.name)return true;
return false;
}
bool operator==(const int age)const
{
if (this->age == age)return true;
return false;
}
string name;
int age;
};
class compare
{
public:
bool operator()(const Person p1, const Person p2)const
{
if (p1.age == p2.age && p1.name == p2.name)return true;
return false;
}
};
void test()
{
vector vtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小劉", 22));
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小林", 17));
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小蔣", 20));
auto cnt=count(vtr.begin(), vtr.end(), Person("小王", 18));
cout < "符合要求的成員個數:" < cnt < endl;
cnt = count(vtr.begin(), vtr.end(), 22);
cout < "年齡等于22的個數:" < cnt < endl;
}
int main()
{
test();
system("pause");
}
3.5 查找個數count
按條件查找:
count_if(_InIt _First, _InIt _Last, _Pr _Pred);--返回查找到個數
形參:_First、_Last --起始和結束迭代器
_Pred --查找條件
返回值:返回查找到的元素位置的迭代器
失敗返回end()
#include
#include
#include
using namespace std;
class Person
{
public:
Person() {}
Person(string name, int age) :name(name), age(age) {
}
string name;
int age;
};
class Compare
{
public:
bool operator()(const Person& p)const
{
if (p.name == "小王" && p.age > 18)return true;
return false;
}
};
void test()
{
vectorvtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小劉", 22));
vtr.push_back(Person("小王", 19));
vtr.push_back(Person("小林", 17));
vtr.push_back(Person("小王", 22));
vtr.push_back(Person("小蔣", 20));
auto ret=count_if(vtr.begin(), vtr.end(), Compare());
cout < "姓名為小王,年齡大于18的個數:" < ret;>
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
算法
+關注
關注
23文章
4607瀏覽量
92826 -
函數
+關注
關注
3文章
4327瀏覽量
62569 -
容器
+關注
關注
0文章
495瀏覽量
22060 -
C++
+關注
關注
22文章
2108瀏覽量
73618 -
STL
+關注
關注
0文章
86瀏覽量
18319
發布評論請先 登錄
相關推薦
c語言入門知識之STL篇
這周終于可以給大家把STL方面的面試題總結出來了,突然發現它里面的細節非常多,只有你想不到的,沒有它沒有的。對于C++程序員來說,STL庫里面的知識也是非常重要的,只要想在技術這條路線上有長遠的發展,那么就一定要掌握它。不管是學
C++ STL的概念及舉例
本篇文章是作者本人使用STL 后的一些看法, 對於想要靠此文章學習STL, 是不可能的. 建議叁后面介紹的一些書入門.
STL的概念
在STL 中, 大至上分三個主要的
發表于 08-30 11:39
?1410次閱讀
STL算法在GIS中的應用
使用STL 算法實現GIS 算法可以保證它的簡潔和高效該文結合C++代碼實例抽象出了地理算子的概念應用在GIS 算法當中通過定制適配器來消除
發表于 06-28 16:55
?33次下載
C++課程資料詳細資料合集包括了:面向對象程序設計與C++,算法,函數等
本文檔的主要內容詳細介紹的是C++課程資料資料合集包括了:面向對象程序設計與C++,算法,函數,概述, C++語言基礎,構造數據類型,數據類型,C+
發表于 07-09 08:00
?18次下載
C++程序設計教程之性能的詳細資料課件說明
本文檔的詳細介紹的是C++程序設計教程之性能的詳細資料課件說明主要內容包括了: 1. 內聯函數 ( Inline Functions ), 2.數據結構 ( Data Structures
發表于 02-21 17:19
?2次下載
C++17 STL標準庫學習教材電子書免費下載
C++標準模板庫(STL)。這本書中的例子展示了如何充分的利用STL。不過,作為本書的第1章,我們還是需要了解一下那些比較重要的新語言特性。
發表于 02-28 08:00
?7次下載
C++ STL基本概念是什么
STL,英文全稱 standard template library,中文可譯為標準模板庫或者泛型庫,其包含有大量的模板類和模板函數,是 C++ 提供的一個基礎模板的集合,用于完成諸如輸入/輸出、數學計算等功能。
C++入門之通用算法
C++ 是一種強大的編程語言,它提供了許多通用算法,可以用于各種容器類型。這些算法是通過迭代器來操作容器中的元素,因此它們是通用的,可以用于不同類型的容器。在本篇博客中,我們將詳細介紹 C++
評論