2020.11.20 第12课 STL算法篇
一、STL算法总结
使用算法容器 重载一些标准
查找算法
adjacent_find : 查重复数,返回首个元素iter
bianry_search: 二分查找
count: 区间统计
count_if: 范围查找统计个数
equal: 比较
equal_range :区间元素比较
find:区间查找元素 !!!!!
find_first_of:区间查找第一次出现值
find_if : 条件查找
upper_bound:查找最后一个大于等于val的位置
lower_bound: 查找第一个大于等于val的位置
search:子序列查找位置
search_n:子序列查找出现次数
排序和通用算法:
merge: 归并排序,存于新容器
inpace_merge: 归并排序,覆盖原区间
sort: 排序,更改原容器顺序 !!!!!
stable_sort: 排序,保存原容器数据顺序
nth_element: 关键字排序
partition:范围排序
partial_sort:范围排序
partial_sort_copy:范围排序外加复制操作
stable_partition: 范围排序,保存原容器顺序
random_shuffle: 随机排序
reverse:逆序原容器
reverse_copy: 逆序容器保存到新容器
rotate:移动元素到容器末尾
rotate_copy:移动元素到新容器
删除和替换
copy: 拷贝函数 !!!!!!!
copy_backward: 逆序拷贝
iter_swap: 交换
remove: 删除
remove_copy: 删除元素复制到新容器
remove_if:条件删除
remove_copy_if:条件删除拷贝到新容器
replace:替换
replace_copy: 替换,结果放到新容器
replace_if: 条件替换
replace_copy_if:条件替换,结果另存
swap: 交换
swap_range:区间交换
unique:去重
unique_copy:去重,结果另存
求和 用到某种算法时根据情况
accumulate:区间求和 !!!!
partial_sum:相邻元素的和
inner_product:序列内积运算
adjacent_difference:相邻元素的差
生成和异变
for_each:迭代访问
fill:填充方式初始容器
fill_n:指定长度填充容器
generate_n:填充前n个位置
transform:一元转换和二元转换 做大小写转换
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <numeric>
#include <string>
#include <functional>
using namespace std;
void print(int data)
{
cout << data << "\t";
}
struct MM
{
string name;
int age;
int num;
bool operator==(MM two)
{
return this->name == two.name;
}
bool operator==(string str)
{
return this->name == str;
}
bool operator<(MM two)
{
return this->name < two.name;
}
};
class myString
{
public:
myString(int capacity = 15)
{
}
protected:
char* str;
int sizeStr;
int capacity;
};
int main()
{
vector<int> array(3);
for (int i = 0; i < 3; i++)
{
array[i] = 2;
}
sort(array.begin(), array.end());
sort(array.begin(), array.end(),greater<int>());
sort(array.begin(), array.end(),less<int>());
cout << accumulate(array.begin(), array.end(), 100) << endl;
cout << count(array.begin(), array.end(), 2) << endl;
cout << *find(array.begin(), array.end(), 2) << endl;
if (find(array.begin(), array.end(), 100) == array.end())
{
cout << "未找到元素" << endl;
}
list<MM> myList;
MM mmData[4] = { "yy",18,1001,"lbw",18,1001,"大力",18,1001,"baby",18,1001 };
for (int i = 0; i < 4; i++)
myList.push_back(mmData[i]);
list<MM>::iterator iter=find(myList.begin(), myList.end(), mmData[2]);
cout << iter->name << "\t" << iter->age << "\t" << iter->num << endl;
iter = find(myList.begin(), myList.end(), "大力");
cout << iter->name << "\t" << iter->age << "\t" << iter->num << endl;
myList.sort();
vector<int> str1(3);
str1[0] = 1;
str1[1] = 3;
str1[2] = 5;
vector<int> str2(3);
str2[0] = 2;
str2[1] = 4;
str2[2] = 6;
vector<int> str3(6);
merge(str1.begin(), str1.end(), str2.begin(), str2.end(), str3.begin());
for_each(str3.begin(), str3.end(), print);
cout << endl;
copy(str3.begin(), str3.end(), ostream_iterator<int>(cout, " "));
ostream_iterator<string> object(cout);
object = "Iloveyou";
cout << endl;
string love = "Iloveyou";
cout << love.c_str() << endl;
string::iterator strIter = love.begin();
for (; strIter != love.end(); strIter++)
{
cout << *strIter;
}
cout << endl;
string saveStr(love);
transform(love.begin(), love.end(), saveStr.begin(),tolower);
cout << saveStr << endl;
transform(love.begin(), love.end(), saveStr.begin(), toupper);
cout << saveStr << endl;
cout << saveStr.capacity() << endl;
cout << saveStr.size() << endl;
string str;
cout << str.capacity() << endl;
return 0;
}
二、堆算法
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
void print(int data)
{
cout << data << " ";
}
int main()
{
int array[] = { 1,4,5,6,23,56,76 };
vector<int> vec;
vec.assign(array, array + 7);
for_each(vec.begin(), vec.end(), print);
make_heap(vec.begin(), vec.end());
cout << endl;
for_each(vec.begin(), vec.end(), print);
cout << endl;
sort_heap(vec.begin(), vec.end());
for_each(vec.begin(), vec.end(), print);
cout << endl << vec.size() << endl;
pop_heap(vec.begin(), vec.end());
for_each(vec.begin(), vec.end(), print);
vector<int> lessHeap;
lessHeap.assign(array, array + 7);
sort(lessHeap.begin(), lessHeap.end());
cout << endl;
for_each(lessHeap.begin(), lessHeap.end(),print);
pop_heap(lessHeap.begin(), lessHeap.end(), greater<int>());
cout << endl;
while (!lessHeap.empty())
{
pop_heap(lessHeap.begin(), lessHeap.end(), greater<int>());
cout << lessHeap.back() << endl;
lessHeap.pop_back();
}
return 0;
}
三、交集和并集
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void print(int data)
{
cout << data << " ";
}
int main()
{
int array[] = { 1, 3, 4, 7, 9 };
int array2[] = { 3,4,5,6,9 };
vector<int> data1;
data1.assign(array, array + 5);
vector<int> data2;
data2.assign(array2, array2 + 5);
vector<int> data3(data1.size() + data2.size());
set_union(data1.begin(), data1.end(), data2.begin(), data2.end(),
data3.begin());
for_each(data3.begin(), data3.end(), print);
cout << endl;
vector<int> data5(data3);
set_intersection(data1.begin(), data1.end(), data2.begin(), data2.end(),
data5.begin());
for_each(data5.begin(), data5.end(), print);
cout << endl;
return 0;
}