算数生成算法
accumulate // 计算容器元素累积总和,第三个参数为起始值
fill // 填充数据
accumulate 案例
// accummulate 案例
void accumulate_example()
{
vector<int> v;
for (int i = 0; i <= 100; i++)
{
v.push_back(i);
}
int total = accumulate(v.begin(), v.end(), 0);
cout << "total = " << total;
}
fill 案例
// fill 案例
void printVec(int val)
{
cout << val << " ";
}
void fill_example()
{
vector<int> v;
v.resize(10); // 填充为 0
fill(v.begin(), v.end(), 100);
for_each(v.begin(), v.end(), printVec);
cout << endl;
}
集合算法
set_intersection // 交集,需要提前准备 min( v1.size(), v2.size() ) 的大小
set_union // 并集,提前准备 v1.size() + v2.size() 的大小
set_difference // 差集,注意顺序,需要提前准备前一个元素 size 的大小
- 集合算法中两个参与的容器必须都是有序的
- 集合算法返回的是集合尾部的迭代器(注意,不是,装集合的容器尾部的迭代器)
set_intersection 案例
// set_intersection 案例
void set_intersection_example()
{
// 必须是有序序列
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
// 提前准备空间
vTarget.resize(min(v1.size(), v2.size()));
// 返回的是交集尾部的迭代器
auto itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
// 注意,这里的结束迭代器要用集合尾部的迭代器,因为可能还有多余元素
for_each(vTarget.begin(), itEnd, printVec);
cout << endl;
}
set_union 案例
// set_union 案例
void set_union_example()
{
// 必须是有序序列
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
// 提前准备空间
vTarget.resize(v1.size() + v2.size());
// 返回的是并集尾部的迭代器
auto itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
// 注意,这里的结束迭代器要用集合尾部的迭代器,因为可能还有多余元素
for_each(vTarget.begin(), itEnd, printVec);
cout << endl;
}
set_difference 案例
// set_difference 案例
void set_difference_example()
{
// 必须是有序序列
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
// 提前准备空间
vTarget.resize(v1.size());
// 返回的是差集尾部的迭代器
auto itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
// 注意,这里的结束迭代器要用集合尾部的迭代器,因为可能还有多余元素
for_each(vTarget.begin(), itEnd, printVec);
cout << endl;
}