头文件#include<algorithm>
常用的遍历算法
for_each()
作用:遍历指定范围内的元素,并对每个元素调用传入的操作函数。
函数原型
template <class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn);
参数
InputIterator:是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器(不包含在范围内)。
fn:是要执行的操作函数。操作函数可以是普通函数、函数对象或lambda表达式。该函数没有返回值,仅用于执行操作
例:
#include <iostream> #include <vector> #include <algorithm> void print(int num) { std::cout << num << " "; } int main() { std::vector<int> nums = {1, 2, 3, 4, 5}; std::for_each(nums.begin(), nums.end(), print); return 0; } //1 2 3 4 5
transform()
作用:将指定容器区间元素搬运到另一容器中
函数原型
template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform(InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperation op);
参数:
InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。
first1是指向输入范围起始位置的迭代器。
last1是指向输入范围结束位置的迭代器(不包含在范围内)。
OutputIterator是输出迭代器类型,用于指定存储结果的范围的起始位置。
result是指向输出范围起始位置的迭代器。
op是要应用的操作函数,可以是函数指针、函数对象或lambda表达式。
注意:
1.transform 不会给目标容器分配内存, 所以需要我们提前分配好内存
2.容器类型要相同
例:
#include <iostream> #include <vector> #include <algorithm> int doubleValue(int num) { return num * 2; } int main() { std::vector<int> nums = {1, 2, 3, 4, 5}; std::vector<int> doubledNums(nums.size()); std::transform(nums.begin(), nums.end(), doubledNums.begin(), doubleValue); for (int num : doubledNums) { std::cout << num << " "; } return 0; } //2 4 6 8 10
常用查找算法
find()
作用:查找区间[begin,end)中是否存在元素。若有,则返回该位置的迭代器,若没有,则返回end()
函数原型
template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
参数
InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器(不包含在范围内)。
T是要查找的值的类型。
value是要查找的值。
例:对普通成员
int main() { vector<int> v1; v1.push_back(18); v1.push_back(28); v1.push_back(19); v1.push_back(38); vector<int>::iterator ret; ret=find(v1.begin(),v1.end(),28); if(ret != v1.end()) cout<<"找到的数据为:"<<*ret<<endl; else cout<<"未找到"<<endl; return 0; }
例:对自定义成员
class Person { public: string name; int age; Person(string name,int age){ this->name=name; this->age=age; } bool operator==(const Person &ob){ if(this->name==ob.name && this->age==ob.age) return true; return false; } }; int main() { vector<Person> v2; v2.push_back(Person("德玛西亚",18)); v2.push_back(Person("小法",19)); v2.push_back(Person("小炮",20)); v2.push_back(Person("牛头",21)); Person tmp("小炮",20); vector<Person>::iterator ret; ret=find(v2.begin(),v2.end(),tmp); if(ret != v2.end()) cout<<"找到的数据为:"<<(*ret).name<<" "<<(*ret).age<<endl; else cout<<"未找到"<<endl; return 0; }
find_if()
作用:在指定范围内查找满足指定条件的元素,并返回指向该元素的迭代器。
函数原型:
template <class InputIterator, class UnaryPredicate>
InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred);
参数:
InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器(不包含在范围内)。
UnaryPredicate是一个一元谓词(接受一个参数并返回一个bool值的函数对象或函数指针),用于指定要满足的条件。
pred是一个一元谓词,用于指定要满足的条件。
例:普通函数
bool myGreaterThan20(int val) { return val>20; } int main() { vector<int> v2; v2.push_back(10); v2.push_back(20); v2.push_back(30); v2.push_back(40); vector<int>::iterator ret; ret=find_if(v2.begin(),v2.end(),myGreaterThan20); if(ret != v2.end()) cout<<"找到的数据为:"<<*ret<<endl; else cout<<"未找到"<<endl; return 0; }
例:仿函数
class MyGreaterThan20{ public: bool operator()(int val) { return val>20; } }; int main() { vector<int> v2; v2.push_back(10); v2.push_back(20); v2.push_back(30); v2.push_back(40); vector<int>::iterator ret; ret=find_if(v2.begin(),v2.end(),MyGreaterThan20()); if(ret != v2.end()) cout<<"找到的数据为:"<<*ret<<endl; else cout<<"未找到"<<endl; return 0; }
adjacent_find()
作用:在指定范围内查找相邻的重复元素,并返回指向第一个重复元素的迭代器。
函数原型:
template <class ForwardIterator>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last);
参数:
ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器(不包含在范围内)。
例1:普通数据
int main() { vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(20); v1.push_back(40); v1.push_back(50); v1.push_back(50); vector<int>::iterator ret; ret=adjacent_find(v1.begin(),v1.end()); if(ret!=v1.end()) cout<<"寻找到重复元素:"<<*ret<<endl; return 0; }
例2:自定义数据(对==进行运算符重载)
class Person { public: string name; int age; Person(string name,int age){ this->name=name; this->age=age; } bool operator==(const Person &ob){ if(this->name==ob.name && this->age==ob.age) return true; return false; } }; int main() { vector<Person> v2; v2.push_back(Person("德玛西亚",18)); v2.push_back(Person("小法",19)); v2.push_back(Person("小法",19)); v2.push_back(Person("牛头",21)); vector<Person>::iterator ret; ret=adjacent_find(v2.begin(),v2.end()); if(ret != v2.end()) cout<<"找到的数据为:"<<(*ret).name<<" "<<(*ret).age<<endl; else cout<<"未找到"<<endl; return 0; }
binary_search
作用:在已排序的范围内,通过二分查找法查找指定的元素,并返回一个bool值表示是否找到。
函数原型:
template <class ForwardIterator, class T>
bool binary_search(ForwardIterator first, ForwardIterator last, const T& value);
参数
ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器(不包含在范围内)。
T是要查找的元素的类型。
value是要查找的元素。
注意:容器必须有序
例:
int main() { vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); bool ret=binary_search(v1.begin(),v1.end(),30); if(ret==true) cout<<"找到"<<endl; else cout<<"未找到"<<endl; return 0; }
count
作用:遍历输入范围内的元素,统计等于给定值的元素的个数,并返回结果。
函数原型:
template <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type count(InputIterator first, InputIterator last, const T& value);
参数:
InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器。
T是要计数的元素的类型。
value是要计数的元素。
例
int main() { vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); cout<<count(v1.begin(),v1.end(),10)<<endl; return 0; }
count_if
作用:遍历输入范围内的元素,统计满足指定条件的元素的个数,并返回结果。
函数原型:
template <class InputIterator, class UnaryPredicate>
typename iterator_traits<InputIterator>::difference_type count_if(InputIterator first,
InputIterator last, UnaryPredicate pred);
参数
InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器。
UnaryPredicate是一个一元谓词(即接受一个参数并返回一个bool值的函数对象或函数指针),用于指定判断条件。
pred是用于判断元素是否满足条件的谓词函数。
例:统计大于10的元素出现的次数
bool myGreaterThan10(int val) { return val>10; } class MyGreaterThan10 { public: bool operator()(int val){ return val>10; } }; int main() { vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); //普通函数 cout<<count_if(v1.begin(),v1.end(),myGreaterThan10)<<endl; //函数对象 cout<<count_if(v1.begin(),v1.end(),MyGreaterThan10())<<endl; //内建函数对象 cout<<count_if(v1.begin(),v1.end(),bind2nd(greater<int>(),10))<<endl; return 0; }
max_element
作用:遍历输入范围内的元素,找到最大的元素,并返回指向该元素的迭代器。
函数原型:
template <class ForwardIterator>
ForwardIterator max_element(ForwardIterator first, ForwardIterator last);
参数
ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器。
例:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> nums = {1, 4, 2, 5, 3}; auto maxIt = std::max_element(nums.begin(), nums.end()); std::cout << "Max element: " << *maxIt << std::endl; return 0; }
min_element
作用:遍历输入范围内的元素,找到最小的元素,并返回指向该元素的迭代器。
函数原型:
template <class ForwardIterator>
ForwardIterator min_element(ForwardIterator first, ForwardIterator last);
参数:
ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器。
例:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> nums = {3, 1, 4, 2, 5}; auto minIt = std::min_element(nums.begin(), nums.end()); std::cout << "Min element: " << *minIt << std::endl; return 0; }
minmax_element
作用:在给定范围内查找最小值和最大值的迭代器。
函数原型:
template <class ForwardIt>
std::pair<ForwardIt, ForwardIt> minmax_element(ForwardIt first, ForwardIt last);
参数
ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器。
例:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> values = {5, 3, 9, 2, 7}; auto minmaxIt = std::minmax_element(values.begin(), values.end()); std::cout << "Min value: " << *minmaxIt.first << std::endl; std::cout << "Max value: " << *minmaxIt.second << std::endl; return 0; }
nth_element
作用:对给定范围内的元素进行部分排序。使得nth之前的元素都小于等于它,nth之后的元素都大于等于它,而第n小的值恰好在nth位置上。
函数原型:
template <class RandomIt>
void nth_element(RandomIt first, RandomIt nth, RandomIt last);
参数
RandomIt是迭代器类型,用于指定要排序的范围。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器。
nth是迭代器,表示要将第n个元素放置的位置。
例
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> values = {5, 3, 9, 2, 7}; std::nth_element(values.begin(), values.begin() + 2, values.end()); std::cout << "Third element: " << values[2] << std::endl; return 0; }
常用排序算法
is_sorted
作用:检查给定范围内的元素是否按升序排序。
函数原型:
template <class ForwardIt>
bool is_sorted(ForwardIt first, ForwardIt last);
参数:
ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。
first是指向范围起始位置的迭代器。
last是指向范围结束位置的迭代器。
例:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> values = {1, 2, 3, 4, 5}; bool sorted = std::is_sorted(values.begin(), values.end()); if (sorted) { std::cout << "The range is sorted." << std::endl; } else { std::cout << "The range is not sorted." << std::endl; } return 0; }
merge
作用:将两个已排序的容器元素合并, 并存储到另一容器中
注意:每个容器必须有序,不是单纯的追加
函数原型:
template <class InputIt1, class InputIt2, class OutputIt>
OutputIt merge(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first);
InputIt1和InputIt2是迭代器类型,用于指定要合并的两个已排序范围。
OutputIt是迭代器类型,用于指定合并后的范围的目标位置。
first1和last1是迭代器,表示第一个已排序范围的起始和结束位置。
first2和last2是迭代器,表示第二个已排序范围的起始和结束位置。
d_first是迭代器,表示合并后的范围的起始位置。
例:
int main() { vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); vector<int> v2; v2.push_back(8); v2.push_back(9); v2.push_back(12); v2.push_back(22); v2.push_back(58); vector<int> v3; v3.resize(v1.size()+v2.size()); merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin()); for_each(v3.begin(),v3.end(),[](int val){ cout<<val<<" "; }); return 0; }
sort
作用:容器元素排序。
注意:默认使用比较函数来对元素进行排序,如果需要自定义排序的方式,可以将谓词做完第三个参数
函数原型:
template<class RandomIt>
void sort(RandomIt first, RandomIt last);
template<class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);
参数:
RandomIt是一个迭代器类型,用于指向排序范围中的元素。
first和last参数分别指定了排序范围的起始位置和结束位置。
例:
//对a数组的[1,n]位置进行从小到大排序 sort(a + 1, a + 1 + n); //对a数组的[0,n-1]位置从大到小排序 sort(a, a + n, greater<int>()); //对a数组的[0,n-1]位置从小到大排序 sort(a, a + n, less<int>()); //自定义排序,定义比较函数 bool cmp1(node x,node y){ return x.s>y.s; //定义降序排序(从大到小) } bool cmp2(node x,node y){ return x.k<y.k; //定义升序排序(从小到大) }
partial_sort
作用:部分排序,将[beg,mid)之间的元素排序,剩余的元素则不保证有序。
注意:默认使用比较函数来对元素进行排序,如果需要自定义排序的方式,可以将谓词做完第三个参数
函数原型:
template<class RandomIt>
void partial_sort(RandomIt first, RandomIt middle, RandomIt last);
template<class RandomIt, class Compare>
void partial_sort(RandomIt first, RandomIt middle, RandomIt last, Compare comp);
参数
RandomIt是一个迭代器类型,用于指向排序范围中的元素。
first和last参数分别指定了排序范围的起始位置和结束位置。
middle参数指定了部分排序后的中间位置。
例:
int a[] = {1,2,5,4,7,9,8,10,6,3}; partial_sort(a, a + 5, a + 10); for(int i = 0; i < 10; i++) cout << a[i] << ' '; //1 2 3 4 5 9 8 10 7 6 //前五个元素都有序 也可以添加自定义排序规则:partial_sort(beg,mid,end,cmp) int a[] = {1,2,5,4,7,9,8,10,6,3}; partial_sort(a, a + 5, a + 10, greater<int>()); for(int i = 0; i < 10; i++) cout << a[i] << ' '; //10 9 8 7 6 1 2 4 5 3 //前五个元素降序有序
stable_sort
作用:和sort功能一样,特别之处在于stable_sort()能够保证相同元素的相对位置不变(稳定性)。
函数原型:
template<class RandomIt>
void stable_sort(RandomIt first, RandomIt last);
template<class RandomIt, class Compare>
void stable_sort(RandomIt first, RandomIt last, Compare comp);
参数:
RandomIt是一个迭代器类型,用于指向排序范围中的元素。
first和last参数分别指定了排序范围的起始位置和结束位置。
例:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {5, 2, 8, 3, 1, 9, 4}; std::stable_sort(numbers.begin(), numbers.end()); std::cout << "Sorted vector: "; for (const auto& num : numbers) { std::cout << num << " "; } std::cout << std::endl; return 0; }
shuffle
作用:对指定范围内的元素随机调整次序。
注意:C++11之后应尽量使用shuffle来代替random_shuffle。
原因:random_shuffle() 函数在重排元素时使用的是默认的随机数生成器,而这个生成器的随机性不够强,容易导致重排结果不够随机。而shuffle() 函数接受一个随机数生成器作为参数,可以使用更强大的随机数生成器来实现随机重排。
函数原型:
template<class RandomIt>
void shuffle(RandomIt first, RandomIt last);
template<class RandomIt, class RandomFunc>
void shuffle(RandomIt first, RandomIt last, RandomFunc&& rand);
参数:
RandomIt是一个迭代器类型,用于指向重排范围中的元素。
first和last参数分别指定了重排范围的起始位置和结束位置。
rand参数可以指定一个随机数生成函数,该函数应该接受一个整数参数,并返回一个表示随机数的整数值。
例:
#include <iostream> #include <algorithm> #include <cstdlib> #include <ctime> #include <vector> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 使用 srand() 函数设置随机数种子 std::srand(std::time(0)); // 使用默认的随机数生成器进行随机重排 std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(std::rand())); // 输出重排后的数组 for (const auto& number : numbers) { std::cout << number << " "; } std::cout << std::endl; return 0; } //为了使用 srand() 作为随机数生成器,我们将 std::rand() 的结果传递给 std::default_random_engine 类,以创建一个默认的随机数生成器
reverse
作用:翻转指定区间内的元素。
函数原型:
template <class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last);
参数:
BidirectionalIterator 是一个满足双向迭代器要求的类型
双向迭代器要求:
可以使用 ++ 运算符在正向方向上移动迭代器,即可以将迭代器向前移动到容器中的下一个元素。
可以使用 -- 运算符在反向方向上移动迭代器,即可以将迭代器向后移动到容器中的上一个元素。
支持解引用操作符 *,可以访问迭代器当前位置的元素。
支持成员函数 !=,用于比较两个迭代器是否指向不同的元素。
支持成员函数 ==,用于比较两个迭代器是否指向相同的元素。
first和last参数分别指定了翻转范围的起始位置和结束位置。
案例
#include <iostream> #include <algorithm> #include <vector> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; // 反转数组的元素 std::reverse(numbers.begin(), numbers.end()); // 输出反转后的数组 for (const auto& number : numbers) { std::cout << number << " "; } std::cout << std::endl; return 0; }
常用拷贝和替换算法
copy
作用:将范围 [first, last) 中的元素复制到以 result 作为起始位置的目标范围中,并返回复制结束的位置的迭代器。
函数原型:
template <class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);
参数:
first:指向要复制的范围的起始位置的迭代器。
last:指向要复制的范围的结束位置的迭代器(不包含在范围内)。
result:指向复制的目标位置的迭代器。
案例
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> source = {1, 2, 3, 4, 5}; std::vector<int> destination(5); // 目标容器,大小为5 std::copy(source.begin(), source.end(), destination.begin()); // 输出目标容器中的元素 for (const auto& num : destination) { std::cout << num << " "; } std::cout << std::endl; return 0; }
replace
作用:将范围 [first, last) 中所有等于 old_value 的元素替换为 new_value。
函数原型:
template<class ForwardIterator, class T>
void replace (ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
参数:
first:指向要替换的范围的起始位置的迭代器。
last:指向要替换的范围的结束位置的迭代器(不包含在范围内)。
old_value:要替换的旧值。
new_value:要替换为的新值。
例:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {1, 2, 3, 2, 4, 2, 5}; std::replace(numbers.begin(), numbers.end(), 2, 6); // 输出替换后的元素 for (const auto& num : numbers) { std::cout << num << " "; } std::cout << std::endl; return 0; } //1 6 3 6 4 6 5
replace_if
作用:将范围 [first, last) 中所有满足 pred 条件的元素替换为 new_value
函数原型:
template<class ForwardIterator, class UnaryPredicate, class T>
void replace_if (ForwardIterator first, ForwardIterator last, UnaryPredicate pred, const T& new_value);
参数:
first:指向要替换的范围的起始位置的迭代器。
last:指向要替换的范围的结束位置的迭代器(不包含在范围内)。
pred:一元谓词函数或函数对象,用于判断元素是否满足替换条件。
new_value:要替换为的新值。
案例
int main() { vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); replace_if(v1.begin(),v1.end(),bind2nd(greater<int>(),30),300); for_each(v1.begin(),v1.end(),[](int val){ cout<<val<<" "; }); cout<<endl; //用copy输出 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," ")); return 0; }
swap
作用:交换两个对象的值
函数原型:
template<class T>
void swap (T& a, T& b);
例:
#include <iostream> #include <vector> #include <algorithm> int main() { int a = 5; int b = 10; std::swap(a, b); std::cout << "a: " << a << std::endl; std::cout << "b: " << b << std::endl; return 0; }
unique
作用:移除连续重复的元素,只保留每个重复元素的第一个副本。返回一个指向不重复元素的末尾位置的迭代器。
函数原型:
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last);
参数:
first:指向要操作的范围的起始位置的迭代器。
last:指向要操作的范围的结束位置的迭代器。
例如:a[] = {1, 3, 2, 3, 6};
unique之后a数组为{1, 2, 3, 6, 3}前面为无重复元素的数组,后面则是重复元素移到后面,返回a[4]位置的地址(不重复元素的尾后地址)
注意:消除重复元素一般需要原序列是有序序列
例:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> nums = {1, 1, 2, 2, 3, 4, 4, 5, 5, 5}; auto last = std::unique(nums.begin(), nums.end()); for (auto it = nums.begin(); it != last; ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; } //1 2 3 4 5
常用算数生成算法
accumulate
作用:计算范围内元素的累加和(或其他二元操作的累积结果)
函数原型:
template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init);
template<class InputIt, class T, class BinaryOp>
T accumulate(InputIt first, InputIt last, T init, BinaryOp op);
参数:
first:指向要操作的范围的起始位置的迭代器。
last:指向要操作的范围的结束位置的迭代器。
init:起始值,用于指定累加的初始值。
op:二元操作函数,用于指定累积操作。
案例1:对普通成员
int main(int argc, char** argv) { int a[]={1,3,5,9,10}; //对[0,2]区间求和,初始值为0,结果为0+1+3+5=9 int res1 = accumulate(a, a + 3, 0); cout<<"累加的和为:"<<res1; //对[0,3]区间求和,初始值为5,结果为5+1+3+5+9=23 int res2 = accumulate(a, a + 4, 5); cout<<"累加的和为:"<<res2; }
案例2:对自定义成员
#include <iostream> #include <vector> #include <numeric> int multiply(int x, int y) { return x * y; } int main() { std::vector<int> nums = {1, 2, 3, 4, 5}; int product = std::accumulate(nums.begin(), nums.end(), 1, multiply); std::cout << "Product: " << product << std::endl; return 0; }
fill
作用:将范围内的所有元素都设置为给定的值。
函数原型:
template<class ForwardIt, class T>
void fill(ForwardIt first, ForwardIt last, const T& value);
参数:
first:指向要填充的范围的起始位置的迭代器。
last:指向要填充的范围的结束位置的迭代器。
value:要填充的值。
注意:和memset区别
void* memset(void* ptr, int value, size_t num);
1.语法和类型安全:fill是C++标准库中的函数,接受迭代器作为参数,可以用于容器和其他可迭代对象。它是类型安全的,可以根据迭代器的类型自动确定要填充的值的类型。而memset是C标准库中的函数,接受指针和字节数作为参数,只能用于原始的内存块,并且需要手动转换为适当的类型。
2.支持的数据类型:fill可以用于任何支持赋值操作的类型,包括内置类型和用户自定义类型。而memset只能用于字节级别的操作,对于非字符类型的数据,需要手动进行类型转换。
3.填充值的限制:fill可以接受任何类型的值作为填充值,包括复杂的数据结构。而memset只能使用一个字节的值进行填充,通常是0或-1。
4.适用范围:fill可以用于任何STL容器(如vector、list、array等)以及普通的数组,可以指定要填充的范围。而memset只能用于连续的内存块,无法指定范围。
例
int main() { vector<int> v1; v1.resize(5); fill(v1.begin(),v1.end(),100); copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," ")); return 0; }
常用集合算法
set_intersection
作用:计算两个有序集合的交集,并将结果存储在另一个集合中。
函数原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
例
#include <iostream> #include <algorithm> #include <vector> int main() { std::vector<int> set1 = {1, 2, 3, 4, 5}; std::vector<int> set2 = {3, 4, 5, 6, 7}; std::vector<int> intersection; std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::back_inserter(intersection)); for (int num : intersection) { std::cout << num << " "; } return 0; } //3 4 5
set_union
作用:计算两个有序集合的并集,并将结果存储在另一个集合中。
函数原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
例:
#include <iostream> #include <algorithm> #include <vector> int main() { std::vector<int> set1 = {1, 2, 3, 4, 5}; std::vector<int> set2 = {3, 4, 5, 6, 7}; std::vector<int> unionSet; std::set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), std::back_inserter(unionSet)); for (int num : unionSet) { std::cout << num << " "; } return 0; } // 1 2 3 4 5 6 7
set_difference
作用:计算两个有序集合的差集,并将结果存储在另一个集合中(容器1中有的,容器2中没有的)
函数原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
例
#include <iostream> #include <algorithm> #include <vector> int main() { std::vector<int> set1 = {1, 2, 3, 4, 5}; std::vector<int> set2 = {3, 4, 5, 6, 7}; std::vector<int> diffSet; std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), std::back_inserter(diffSet)); std::cout << "Difference: "; for (int num : diffSet) { std::cout << num << " "; } return 0; }