天天看點

STL常用算法 -- 周遊 查找STL常用算法–周遊查找

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;
}