STL常用算法–周遊查找
本文為作者學習黑馬程式員匠心C++教程的學習筆記
若無特殊說明, 都應該包含頭檔案 #include< algorithm >
目錄
- STL常用算法--周遊查找
-
- 周遊
-
- for_each
- transform
- 查找
-
- find
- find_if
- adjacent_find
- binary_search
- count
- count_if
周遊
for_each
用函數周遊元素
for_each(iterator begin, iterator end, _func);
for_each(開始疊代器, 結束疊代器, _func函數或者函數對象);
//普通函數
void print(int i)
{
cout << i << endl;
}
//仿函數
class Print
{
public:
void operator()(int i)
{
cout << i << endl;
}
};
void test()
{
vector<int>v;
for (int i = 0; i < 10; i++) v.push_back(i);
//普通函數對象
for_each(v.begin(), v.end(), print);
//重載了 () 的匿名函數對象
for_each(v.begin(), v.end(), Print());
}
transform
将一個容器中的元素搬運容器到另一個容器中, 前提是目标容器需要提前開辟空間
transform(iterator begin1, iterator end1, iterator begin2, _func);
transform(原容器開始疊代器, 原容器結束疊代器, 目标容器開始疊代器,函數或者函數對象(回調函數));
class Transform
{
// 在搬運的過程中可以進行一些操作
public:
int operator()(int i)
{
return i;
}
};
void test()
{
vector<int> v;
for (int i = 0; i < 10; i++)
v.push_back(i);
vector<int> v1;
v1.resize(v.size()); //提前開辟空間
transform(v.begin(), v.end(), v1.begin(), Transform()); //搬運
}
查找
find
查找制定元素出現位置
find(iterator begin, iterator end, value);
find(開始疊代器, 結束疊代器, 查找的元素)
//找到傳回指定位置疊代器, 找不到傳回.end()
//查找内置的資料類型
void test()
{
vector<int>v;
for (int i = 0; i < 10; i++)
v.push_back(i);
vector<int>v1;
//查找容器中是否有 5 , 傳回其第一次出現的位置
vector<int>::iterator it = find(v.begin(), v.end(), 5);
}
//查找自定義資料類型(需要重載 == 号)
class Person
{
public:
Person(string name, int age) : m_Age(age), m_Name(name) {}
//重載==号, 讓find知道如何對比 Person 資料類型
bool operator==(const Person& p) {
if (this->m_Age == p.m_Age && this->m_Name == p.m_Name)
return true;
else
return false;
}
string m_Name;
int m_Age;
};
void test()
{
vector<Person> v;
Person p1("aa", 10);
Person p2("bb", 20);
Person p3("cc", 30);
Person p4("dd", 40);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
//查找容器中是否有 p2 這個元素 , 傳回其第一次出現的位置
vector<Person>::iterator it = find(v.begin(), v.end(), p2);
if (it == v.end())
cout << "Not Found" << endl;
else
cout << "Name : " << (*it).m_Name << endl;
}
find_if
按條件查找元素
find_if(iterator beg, iterator end, _Pred);
find_if(開始疊代器, 結束疊代器, 函數或者謂詞);
//查找内置資料類型
class GreatFive
{
public:
bool operator()(int i)
{
return i > 5;
}
};
void test()
{
vector<int>v;
for (int i = 0; i < 10; i++)
v.push_back(i);
//查找容器中是否有 5 這個元素 , 傳回其第一次出現的位置, 找不到則傳回 v.end()
vector<int>::iterator it = find_if(v.begin(), v.end(), GreatFive());
if (it == v.end())
cout << "Not Found" << endl;
else
cout << *it << endl;
}
//查找自定義資料類型
class Person
{
public:
Person(string name, int age)
{
this->m_Age = age;
this->m_Name = name;
}
string m_Name;
int m_Age;
};
class Greater20
{
public:
int operator()(const Person& p)
{
return p.m_Age > 20;
}
};
void test()
{
vector<Person>v;
Person p1("aa", 10);
Person p2("bb", 20);
Person p3("cc", 30);
Person p4("dd", 40);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
//查找容器中是否有 滿足條件的元素 , 傳回其第一次出現的位置
vector<Person>::iterator it = find_if(v.begin(), v.end(), Greater20());
if (it == v.end())
cout << "Not Found" << endl;
else
cout << "Name : " << (*it).m_Name << endl;
}
adjacent_find
查找相鄰重複元素
adjacent_find(iterator beg, iterator end);
adjacent_find(開始疊代器, 結束疊代器);
//查找相鄰重複元素。傳回第一對相鄰元素的第一個位置的疊代器, 未找到則傳回.end()
void test()
{
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(3);
v.push_back(3);
v.push_back(4);
v.push_back(5);
vector<int>::iterator it = adjacent_find(v.begin(), v.end());
if (it == v.end())
cout << "Not Found" << endl;
else
cout << *it << endl;
}
binary_search
查找指定元素是否存在
binary_search(iterator beg, iterator end, value);
binary_search(開始疊代器, 結束疊代器, 查找的元素);
//查找指定的元素,查到傳回true 否則false
//隻查找并表示有或沒有, 不會傳回有幾個和它的位置
//在無序序列中不可用
void test()
{
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
bool it = binary_search(v.begin(), v.end(), 3);
cout << it << endl;
}
count
統計元素個數
count(iterator beg, iterator end, value);
count(開始疊代器, 結束疊代器, 統計的元素);
//統計内置資料類型
void test()
{
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(3);
v.push_back(3);
int it = count(v.begin(), v.end(), 3);
cout << it << endl;
}
//統計自定義資料類型
class Person
{
public:
Person(string name, int age) : m_Age(age), m_Name(name) {}
//重載==号, 讓 編譯器 知道如何對比 Person 資料類型
bool operator==(const Person& p)
{
if (this->m_Age == p.m_Age)
return true;
else
return false;
}
string m_Name;
int m_Age;
};
void test()
{
vector<Person>v;
Person p1("aa", 10);
Person p2("bb", 20);
Person p3("cc", 20);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
Person p("ee", 20);
int cnt = count(v.begin(), v.end(), p);
cout << cnt << endl;
}
count_if
按條件統計元素個數
count_if(iterator beg, iterator end, _Pred);
count_if(開始疊代器, 結束疊代器, 謂詞);
//内置資料類型
class Great3
{
public:
bool operator()(int i)
{
return i > 3;
}
};
void test()
{
vector<int>v;
v.push_back(1);
v.push_back(3);
v.push_back(3);
v.push_back(4);
v.push_back(5);
int it = count_if(v.begin(), v.end(), Great3());
cout << it << endl;
}
//自定義資料類型
class Person
{
public:
Person(string name, int age) : m_Age(age), m_Name(name) {}
string m_Name;
int m_Age;
};
class Greater20
{
public:
int operator()(const Person& p)
{
return p.m_Age > 20;
}
};
void test()
{
vector<Person>v;
Person p1("aa", 10);
Person p2("bb", 20);
Person p3("cc", 20);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
int cnt = count_if(v.begin(), v.end(), Greater20());
cout << cnt << endl;
}