2021年11月17日 C++STL库 algorithm&&numeric

#include <algorithm> 

for_each

for_each(iterator beg, iterator end, _func);

"遍历算法 遍历容器元素"
 "beg 开始迭代器"
 "end 结束迭代器"
" _func 函数或者函数对象"

transform  

transform(iterator beg1, iterator end1, iterator beg2, _func);
"beg1 源容器开始迭代器"
"end1 源容器结束迭代器"
"beg2 目标容器开始迭代器"
"_func 函数或者函数对象"



第三点很重要,必须提前预留好足够大的空间,这样才能转移;

第四点很重要 ,可以整体修改序列,比如全部加上100这样子;

vector<int>vTarget;  "目标容器"
vTarget.resize(v.size());  "标容器需要提前开辟空间"
transform(v.begin(), v.end(), vTarget.begin(), TransForm());

 find

find(iterator beg, iterator end, value);
 "按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置"
 " beg 开始迭代器"
 "end 结束迭代器"
 "value 查找的元素"

Example: 

vector<Person>::iterator it = find(v.begin(), v.end(), p2);
if (it == v.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "找到姓名:" << it->m_Name << " 年龄: " << it->m_Age << endl;
}

find_if 

 非自定义数据类型

class GreaterFive
{
    public:
    bool operator()(int val)
    {
        return val > 5;
    }
};
"找到第一个大于5的数字的位置"
vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
if (it == v.end()) {
        cout << "没有找到!" << endl;
    }
else {
    cout << "找到大于5的数字:" << *it << endl;
    }

自定义数据类型 

class Greater20
{
    public:
    bool operator()(Person &p)
    {
        return p.m_Age > 20;
    }
};

vector<Person>::iterator it = find_if(v.begin(), v.end(), Greater20());
if (it == v.end())
{
    cout << "没有找到!" << endl;
}
else
{
    cout << "找到姓名:" << it->m_Name << " 年龄: " << it->m_Age << endl;
}

拓展:

lower_bound(arr[],arr[]+size,indx):查找第一个大于或等于某个元素的位置

 upper_bound(arr[] , arr[]+size , indx)   : 查找第一个大于某个元素的位置

adjacent_find 

vector<int>::iterator it = adjacent_find(v.begin(), v.end());
if (it == v.end()) {
    cout << "找不到!" << endl;
}
else {
    cout << "找到相邻重复元素为:" << *it << endl;
}

binary_search 

 

 无序序列不能用:也就说,在map和set中使用很强大,而对vector使用要先排序。 

 count

 统计自定义数据类型时候,需要配合重载 operator==(目前暂时不明白重载的意思)

count_if

class Greater4
{
    public:
        bool operator()(int val)
        {
            return val >= 4;
        }
};

int num = count_if(v.begin(), v.end(), Greater4());

sort 

 当然sort可以自定义排序方式,通过最后一个函数参数来实现,c++自己有几个表示逻辑关系的函数比如"greater"和"less ",同样的我们也可以用自己写的仿函数来实现这个功能。

less<type>()    "从小到大排序 <"
grater<type>()  "从大到小排序 >"
less_equal<type>()     "<="
gtater_equal<type>()   ">="

random_shuffle

目前感觉无用处,好像是实现洗牌算法的工具。

merge 

 注意:1、合并的两个容器必须有序; (vector,list可以先sort一下,set和map倒是不用了)

            2、接受容器必须先预留好空间;   v3.resize(v1.size()+v2.size())

vector<int> v1;
vector<int> v2;
vector<int> vtarget;
"目标容器需要提前开辟空间"
vtarget.resize(v1.size() + v2.size());
"合并 需要两个有序序列"
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin());
for_each(vtarget.begin(), vtarget.end(), myPrint());

 主要是感觉在链表处很有用!

reverse 

 强大,前序和后序遍历之间相互转化的应用。

copy

同样的拷贝的时候也要预留空间。

copy的使用样例:

"将数组myints中的元素向左移动一位"
copy(myints + 1, myints + 7, myints);

replace 

  样例:(实际上就是,把区间内所有的"oldvalue"改为"newvalue"

 replace_if

 

swap  


 #include <numeric>

accumulate 

 显然,accumulate的参数肯定不止3个,第四个参数(仿函数专属位子)用来处理非内置数据类型(即自定义数据类型)。这个具体的使用方法还没细看,日后再说。

fill 

 就是区间内所有的元素全部被填充为"value"

Guess you like

Origin blog.csdn.net/LEewhITe2003/article/details/121375286