🤔遍历算法:
🙂1.for_each 遍历容器
🔍介绍:
在C++中,for_each是一个用于遍历容器元素并对它们进行操作的算法。它通常有三个参数:
📖1. 容器的起始位置(iterator)
📖2. 容器的结束位置(iterator)
📖3. 遍历时调用的参数(func)
for_each`函数的基本格式如下:
std::for_each(containerBegin, containerEnd, operationFunc);
📖其中,containerBegin和containerEnd是指容器的起始和结束位置;operationFunc是指用于操作元素的函数对象。
📖对于operationFunc参数,它可以是一个普通函数、一个函数对象、一个lambda表达式,或者是一个指向成员函数的指针,只要它满足指定的函数签名即可。该函数或函数对象需要接受一个输入元素,并对其进行操作。 for_each算法将会遍历容器的所有元素,并对每个元素依次调用 operationFunc`函数。
简单的说就是第三个参数既可以调用普通函数,也可以调用仿函数。
🔍代码示例:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//普通函数:
void print(int val)
{
cout << val;
}
//仿函数:
class print02
{
public:
void operator()(int val)
{
cout << val;
}
};
void test01()
{
vector<int>d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
cout << "调用普通函数";
for_each(d1.begin(), d1.end(), print);
cout << endl;
cout << "调用仿函数";
print02 p;
for_each(d1.begin(), d1.end(), print02());
}
int main()
{
test01();
}
🔍运行结果:
🙂2.transform 搬运容器到另一个容器
🔍介绍:
在C++中,transform是一个标准库函数,用于将一个序列的元素进行转换。它通常有三个参数:
📖1. 输入序列的起始位置(iterator)
📖2. 输入序列的结束位置(iterator)
📖3. 输出序列的起始位置(iterator)
此外,它通常还有一个可选的第四个参数,即用于转换的函数,该函数接受一个输入元素并返回一个输出元素。
所以,transform函数的基本格式如下:
std::transform(inputBegin, inputEnd, outputBegin, transformFunc);
📖其中,inputBegin和inputEnd是指输入序列的起始和结束位置;outputBegin是指输出序列的起始位置;transformFunc是指用于转换的函数。
📖对于`transformFunc`参数,它可以是一个普通函数、一个函数对象、一个lambda表达式,或者是一个指向成员函数的指针,只要它满足指定的函数签名即可。该函数或函数对象需要接受一个输入元素,并返回一个输出元素,用于执行从输入到输出元素的转换。
🔍代码示例:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void printc(int val)
{
cout << val;
}
//普通函数:
int print(int val)
{
return val;
}
//仿函数:
class print02
{
public:
int operator()(int val)
{
return val;
}
};
void test01()
{
vector<int>d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
vector<int>d2;
d2.resize(d1.size());
cout << "transform调用普通函数"<<endl;
transform(d1.begin(), d1.end(), d2.begin(), print);
for_each(d2.begin(), d2.end(), printc);
cout << endl;
cout << "transform调用仿函数" << endl;
vector<int>d3;
d3.resize(d1.size());
transform(d1.begin(), d1.end(), d3.begin(), print);
for_each(d3.begin(), d3.end(), printc);
}
int main()
{
test01();
}
🔍运行结果:
🤔所有遍历算法:
在C++标准库中,提供了一系列的遍历算法,可以方便地对容器中的元素进行遍历和操作。这里我们简单总结一下:
📖1. for_each :对容器内的每个元素执行一个操作,可以使用函数、函数对象或者Lambda表达式来进行操作。
📖2. for_each_n :对容器内的前n个元素执行一个操作,可以使用函数、函数对象或者Lambda表达式来进行操作。
📖3. count :用于统计容器中指定值的出现次数,返回一个整数。
📖4. count_if :用于统计满足指定条件的元素个数,返回一个整数。
📖5. find: 在容器中查找某个元素,返回该元素在容器中的迭代器,没有找到返回 `containerEnd`。
📖6. find_if:在容器中查找满足特定条件的第一个元素,返回该元素在容器中的迭代器,没有找到返回 `containerEnd`。
📖7. find_if_not:在容器中查找不满足特定条件的第一个元素,返回该元素在容器中的迭代器,没有找到返回 `containerEnd`。
📖8. search:在容器中查找另一个小容器的首次出现,返回小容器首次出现位置的迭代器,没有找到返回 `containerEnd`。
📖9. transform:将一个序列的元素进行转换放入另一个序列中,可以使用函数、函数对象或者Lambda表达式来进行转换。
📖10. remove :从容器中删除所有指定值,返回删除后的容器的结束位置迭代器。
📖11. `remove_if` :从容器中删除满足特定条件的所有元素,返回删除后的容器的结束位置迭代器。
📖12. replace :将容器中的所有指定值替换为另一个值,返回替换后的容器的结束位置迭代器。
📖13. replace_if :将容器中满足特定条件的元素替换为另一个值,返回替换后的容器的结束位置迭代器。
📖14. reverse :容器反转,返回容器的起始位置迭代器。
📖15. rotate :将容器的元素旋转一定的距离,返回旋转后容器的起始位置迭代器。
📖16. swap_ranges:交换两个容器之间指定范围的元素,返回第二个容器的结束位置迭代器。
📖17. unique`:将容器中连续重复的元素删除,返回删除后的容器的结束位置迭代器。
需要注意的是,这些算法都依赖于容器的迭代器,因此要确保传入的参数是指向容器中的合法位置。