写在前面
本篇内容为学习记录用,如有错误欢迎批评指正
STL常用算法
通用打印数据
我自己方便打印后续打印调用写的
void print_int_one(int val)
{
std::cout << val << ' ';
}
遍历算法
1、遍历元素:遍历容器中每个元素,并进行相关操作:
函数原型:for_each(iterator begin,iterator end)
// 遍历算法 for_each(iterator begin,iterator end,),遍历容器中的元素;
// parameter : begin-开始迭代器 end-结束迭代器 _func-仿函数,用于指定将遍历的元素进行何种操作
void for_each_test()
{
std::vector<int> m_vector;
for (int i = 0; i < 10; ++i) {
m_vector.emplace_back(i * i);
}
std::for_each(m_vector.begin(), m_vector.end(), print_int_one); //打印每个元素
std::cout << std::endl;
}
2、搬运元素:将原容器的元素搬运至目标容器
函数原型:transform(iterator begin_1,iterator end_1,iterator begin_2,_func)
// 遍历算法 transform(iterator begin_1,iterator end_1,iterator begin_2,_func),将源容器的内容搬运到目标容器中;
// parameter : begin_1-源容器的开始迭代器 end_1-源容器的结束迭代器 begin_2-目标容器的开始迭代器
// parameter : _func 在搬运容器时,对搬运容器内的元素进行操作
void transform_test()
{
std::vector<int> m_source;
for (int i = 0; i < 10; ++i) {
m_source.emplace_back(i * i);
}
std::vector<int> m_target;
m_target.resize(m_source.size());
std::transform(m_source.begin(), m_source.end(), m_target.begin(), [](int val) { return val * 2; }); //元素乘2后放入新容器中
std::for_each(m_target.begin(), m_target.end(), print_int_one);
std::cout << std::endl;
}
查找算法
1、一般查找,找到指定值在容器内的位置
函数原型:find(iterator begin,iterator end ,value)
//查找算法 find(iterator begin,iterator end ,value) 查找容器中每个元素,找到则返回第一次出现的迭代器,反之返回结束迭代器
// parameter : begin-开始迭代器 end-结束迭代器 value-查找的元素
void find_test()
{
std::vector<int> m_source;
for (int i = 0; i < 10; ++i) {
m_source.emplace_back(i * i);
}
std::vector<int>::iterator pit = std::find(m_source.begin(), m_source.end(), 4); //查找元素为4
if (pit == m_source.end())
std::cout << "no find val" << std::endl;
else
std::cout << "find val:" << *pit << std::endl;
}
2、条件查找:根据条件在容器内查找元素位置
函数原型:find_if(iterator begin,iterator end ,_pred)
// 查找算法 find_if(iterator begin,iterator end ,_pred) 条件查找容器中每个元素,找到满足_pred函数条件的首个迭代器
// parameter : begin-开始迭代器 end-结束迭代器 _pred-bool类型的仿函数
void find_if_test()
{
std::vector<int> m_source;
for (int i = 0; i < 10; ++i) {
m_source.emplace_back(i * i);
}
std::vector<int>::iterator pit = std::find_if(m_source.begin(), m_source.end(), [](int val) { return val > 16; }); //查找比16大的元素
if (pit == m_source.end())
std::cout << "no find val" << std::endl;
else
std::cout << "find val:" << *pit << std::endl;
}
3、查找相邻重复元素
函数原型:adjacent_find(iterator begin,iterator end )
// 查找算法 adjacent_find(iterator begin,iterator end ) 查找容器中相邻重复元素,找到则返回相邻元素的第一个位置,反之返回结束迭代器
// parameter : begin-开始迭代器 end-结束迭代器
void adjacent_find_test()
{
std::vector<int> m_source{1, 2, 3, 4, 4, 5, 7, 8, 9, 9};
std::vector<int>::iterator pit = std::adjacent_find(m_source.begin(), m_source.end());
if (pit == m_source.end())
std::cout << "no find Same element" << std::endl;
else
std::cout << "Same element:" << *pit << std::endl;
}
4、二分查找指定元素,前提是容器是有序的
函数原型:binary_search(iterator begin,iterator end ,value)
// 查找算法 binary_search(iterator begin,iterator end ,value) 二分查找容器内是否存在指定元素,返回true或false
// parameter : begin-开始迭代器 end-结束迭代器 value-要查找的值
// note:前提是容器是有序的
void binary_search_test()
{
std::vector<int> m_source;
for (int i = 0; i < 10; ++i) {
m_source.emplace_back(i * i);
}
bool ret = std::binary_search(m_source.begin(), m_source.end(), 4); //查找元素为4
if (ret)
std::cout << " find value" << std::endl;
else
std::cout << " no find value" << std::endl;
}
5、统计次数:统计元素在容器中出现的次数
函数原型:count(iterator begin,iterator end ,value)
// 查找算法 count(iterator begin,iterator end ,value) 统计元素在容器中出现的次数
// parameter : begin-开始迭代器 end-结束迭代器 value-要查找的值
void count_test()
{
std::vector<int> m_source{1, 2, 3, 4, 6, 5, 4, 5, 6, 4, 3, 5};
int ret = std::count(m_source.begin(), m_source.end(), 5); //统计元素5出现的次数
std::cout << " Repetitions:" << ret << std::endl;
}
6、条件统计:按条件统计元素在容器中出现的次数
函数原型:count_if(iterator begin,iterator end ,_pred)
// 查找算法 count_if(iterator begin,iterator end ,_pred) 按条件统计元素在容器中出现的次数
// parameter : begin-开始迭代器 end-结束迭代器 _pred-bool类型的仿函数
void count_if_test()
{
std::vector<int> m_source;
for (int i = 0; i < 10; ++i) {
m_source.emplace_back(i * i);
}
int ret = std::count_if(m_source.begin(), m_source.end(), [](int val) { return val > 10; }); //统计元素大于10出现的次数
std::cout << " Repetitions:" << ret << std::endl;
}
7、查找插入元素不影响容器有序性的位置
注意:容器必须为有序序列
//查找算法 lower_bound(iterator begin,iterator end,value)返回插入元素不影响有序性的第一个位置
//查找算法 upper_bound(iterator begin,iterator end,value)返回插入元素不影响有序性的最后一个位置
//查找算法 equal_range(iterator begin,iterator end,value)返回插入元素不影响有序性的第一个和最后一个位置
// parameter : begin-开始迭代器 end-结束迭代器 value-查找值
//note:容器有序
void equal_range_test()
{
std::vector<int> m_source{1, 1, 3, 4, 5, 6, 7, 6, 8, 6, 9, 5};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
auto m_result1 = std::lower_bound(m_source.begin(), m_source.end(), 5); //返回插入元素不影响有序性的第一个位置
if (m_result1 == m_source.end())
std::cout << "no find val" << std::endl;
else
std::cout << *m_result1 << std::endl;
auto m_result2 = std::upper_bound(m_source.begin(), m_source.end(), 5); //返回插入元素不影响有序性的最后一个位置
if (m_result2 == m_source.end())
std::cout << "no find val" << std::endl;
else
std::cout << *m_result2 << std::endl;
auto m_result3 = std::equal_range(m_source.begin(), m_source.end(), 5); //返回插入元素不影响有序性的第一个和最后一个位置
if (m_result3.first == m_result3.second)
std::cout << "no find val" << std::endl;
else
std::cout << *m_result3.first << ' ' << *m_result3.second << std::endl;
}
排序算法
1、sort快排:
函数原型:sort(iterator begin,iterator end ,_pred)
// 排序算法 sort(iterator begin,iterator end ,_pred) 对容器元素进行排序
// parameter : begin-开始迭代器 end-结束迭代器 _pred-bool类型的仿函数,排序标准
void sort_test()
{
std::vector<int> m_source{2, 34, 53, 4, 54, 23, 21};
std::sort(m_source.begin(), m_source.end(), [](int a, int b) { return a < b; }); //升序排序
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
std::sort(m_source.begin(), m_source.end(), [](int a, int b) { return a > b; }); //降序排序
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
2、洗牌算法:将容器内的随机打乱,也称洗牌算法
函数原型:shuffle(iterator begin,iterator end)
// 洗牌算法 shuffle(iterator begin,iterator end)将容器内的随机打乱,也称洗牌算法
// parameter : begin-开始迭代器 end-结束迭代器
void shuffle_test()
{
std::vector<int> m_source{1, 2, 3, 4, 5, 6, 7};
std::random_device rd;
std::mt19937 generator(rd());
std::shuffle(m_source.begin(), m_source.end(), generator);
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
3、合并算法:将两个有序容器的元素合并到新的容器内
函数原型:merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
// 合并算法 merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)将两个有序容器的元素合并到新的容器内
// parameter : beg1-开始迭代器1 end1-结束迭代器1 beg2-开始迭代器2 end2-结束迭代器2 dest-目标容器
// note:两个源容器必须有序,且排序一致
void merge_test()
{
std::vector<int> m_source1;
std::vector<int> m_source2;
for (int i = 0; i < 10; ++i) {
m_source1.emplace_back(std::rand() % 100 + 5);
m_source2.emplace_back(std::rand() % 100 + 5);
}
std::sort(m_source1.begin(), m_source1.end(), [](int a, int b) { return a < b; }); //升序
std::sort(m_source2.begin(), m_source2.end(), [](int a, int b) { return a < b; }); //升序
std::vector<int> m_dest;
m_dest.resize(m_source1.size() * 2);
std::merge(m_source1.begin(), m_source1.end(), m_source2.begin(), m_source2.end(), m_dest.begin());
std::for_each(m_source1.begin(), m_source1.end(), print_int_one);
std::cout << std::endl;
std::for_each(m_source2.begin(), m_source2.end(), print_int_one);
std::cout << std::endl;
std::for_each(m_dest.begin(), m_dest.end(), print_int_one);
std::cout << std::endl;
}
4、反转算法:将容器内的元素进行反转
函数原型:reverse(iterator begin,iterator end)
// 反转算法 reverse(iterator begin,iterator end)将容器内的元素进行反转
// parameter : begin-开始迭代器 end-结束迭代器
void reverse_test()
{
std::vector<int> m_source{1, 2, 3, 4, 5, 5, 6, 7, 7, 2, 12};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
std::reverse(m_source.begin(), m_source.end());
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
替换算法
1、一般替换:将容器内的旧元素换成新元素
函数原型:replace(iterator beg,iterator end,oldvalue,newvalue)
// 批量替换 replace(iterator beg,iterator end,oldvalue,newvalue)//将容器内的旧元素换成新元素
// parameter : beg-开始迭代器 end-结束迭代器 oldvalue-旧值 newvalue-新值
void replace_test()
{
std::vector<int> m_source{1, 2, 3, 4, 5, 5, 6, 7, 7, 2, 12};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
std::replace(m_source.begin(), m_source.end(), 5, 0);
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
2、条件替换:满足条件的元素进行替换
函数原型:replace_if(iterator beg,iterator end,_pred,newvalue)
// 条件替换 replace_if(iterator beg,iterator end,_pred,newvalue)满足条件的元素进行替换
// parameter : beg-开始迭代器 end-结束迭代器 _pred-条件判断 newvalue-新值
void replace_if_test()
{
std::vector<int> m_source{1, 2, 3, 4, 5, 5, 6, 7, 7, 2, 12};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
std::replace_if(
m_source.begin(), m_source.end(), [](int val) { return val > 6 && val < 10; }, 11);
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
3、元素交换:交换两个相同容器内的元素
函数原型:swap(container source1,container source2)
// 元素交换 swap(container source1,container source2)交换两个相同容器内的元素
// parameter : source1-容器1 source2-容器2
void swap_test()
{
std::vector<int> m_source1{1, 2, 3, 4, 5, 6, 7};
std::vector<int> m_source2{7, 6, 5, 4, 3, 2, 1};
std::swap(m_source1, m_source2);
std::for_each(m_source1.begin(), m_source1.end(), print_int_one);
std::cout << std::endl;
std::for_each(m_source2.begin(), m_source2.end(), print_int_one);
std::cout << std::endl;
}
删除算法
1、删除指定区间的元素
函数原型:erase(iterator beg,iterator end)/erase(iterator beg)
//删除元素 erase(iterator beg,iterator end)删除【beg,end】区间的元素
//删除元素 erase(iterator beg)删除第beg个位置的元素
// parameter : beg-开始迭代器 end-结束迭代器
void erase_test()
{
std::vector<int> m_source{1, 2, 3, 4, 5, 6, 7};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
m_source.erase(m_source.begin()); //删除首位元素
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
m_source.erase(m_source.begin() + 1, m_source.end() - 1); //删除区间元素
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
2、删除指定值元素,并不执行真正的删除,只是让该值后面的元素移到前面,真正的删除用erase
函数原型:remove(iterator beg,iterator end,value)
//删除元素 remove(iterator beg,iterator end,value),并不执行真正的删除,只是让该值后面的元素移到前面,真正的删除用erase
// parameter : beg-开始迭代器 end-结束迭代器 value-元素值 ,返回有效元素末尾之后的位置
void remove_test()
{
std::vector<int> m_source{1, 2, 3, 4, 5, 5, 3, 7};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
auto pit = std::remove(m_source.begin(), m_source.end(), 5);
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
m_source.erase(pit, m_source.end());
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
3、按条件删除元素,并不执行真正的删除,只是让该值后面的元素移到前面,真正的删除用erase
函数原型:remove(iterator beg,iterator end,_pred)
//删除元素 remove(iterator beg,iterator end,_pred),并不执行真正的删除,只是让该值后面的元素移到前面,真正的删除用erase
// parameter : beg-开始迭代器 end-结束迭代器 _pred-仿函数 ,返回有效元素末尾之后的位置
void remove_if_test()
{
std::vector<int> m_source{1, 2, 3, 4, 5, 5, 3, 7};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
auto pit = std::remove_if(m_source.begin(), m_source.end(), [](int val) { return val > 3; });
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
m_source.erase(pit, m_source.end());
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
4、删除重复元素:并不执行真正的删除,同remove
函数原型:unique(iterator beg,iterator end)
//删除重复元素 unique(iterator beg,iterator end)并不执行真正的删除,同remove
// parameter : beg-开始迭代器 end-结束迭代器
void unique_test()
{
std::vector<int> m_source{1, 2, 2, 2, 3, 4, 5, 5, 3, 7};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
auto pit = std::unique(m_source.begin(), m_source.end());
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
m_source.erase(pit, m_source.end());
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl;
}
算数生成算法
1、累计求和:容器内元素累计求和
函数原型:accumulate(iterator beg,iterator end,value)
// 累积求和 accumulate(iterator beg,iterator end,value) 容器内元素累计求和
// parameter : beg-开始迭代器 end-结束迭代器 value-求和起始值
void accumulate_test()
{
std::vector<int> m_source1{1, 2, 3, 4, 5, 6, 7};
std::for_each(m_source1.begin(), m_source1.end(), print_int_one);
std::cout << std::endl;
int totle1 = std::accumulate(m_source1.begin(), m_source1.end(), 0);
int totle2 = std::accumulate(m_source1.begin(), m_source1.end(), 100);
std::cout << totle1 << ' ' << totle2 << std::endl;
}
2、填充元素:向容器内填充值
函数原型:fill(iterator beg,iterator end,value)
// 填充元素 fill(iterator beg,iterator end,value) 向容器内填充值
// parameter : beg-开始迭代器 end-结束迭代器 value-填充值
void fill_test()
{
std::vector<int> m_source1{1, 2, 3, 4, 5, 6, 7};
std::for_each(m_source1.begin(), m_source1.end(), print_int_one);
std::cout << std::endl;
std::fill(m_source1.begin(), m_source1.end(), 0);
std::for_each(m_source1.begin(), m_source1.end(), print_int_one);
std::cout << std::endl;
}
集合操作
集合的交集、并集、差集求解
函数原型:交集 set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
并集 set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
差集 set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
// 集合算法
// 交集 set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
// 并集 set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
// 差集 set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
// parameter : beg-开始迭代器 end-结束迭代器 dest-目标容器起始迭代器
// note:两个集合必须有序
void set_test()
{
std::vector<int> m_source1{1, 2, 3, 4, 5, 6, 7};
std::vector<int> m_source2{5, 6, 7, 8, 9, 10, 11};
std::for_each(m_source1.begin(), m_source1.end(), print_int_one);
std::cout << std::endl;
std::for_each(m_source2.begin(), m_source2.end(), print_int_one);
std::cout << std::endl;
std::vector<int> m_dest1;
m_dest1.resize(std::min(m_source2.size(), m_source1.size()));
std::set_intersection(m_source1.begin(), m_source1.end(), m_source2.begin(), m_source2.end(), m_dest1.begin()); //交集
std::for_each(m_dest1.begin(), m_dest1.end(), print_int_one);
std::cout << std::endl;
m_dest1.resize(m_source1.size() + m_source2.size());
std::set_union(m_source1.begin(), m_source1.end(), m_source2.begin(), m_source2.end(), m_dest1.begin()); //并集
std::for_each(m_dest1.begin(), m_dest1.end(), print_int_one);
std::cout << std::endl;
m_dest1.resize(std::max(m_source1.size(), m_source2.size()));
std::fill(m_dest1.begin(), m_dest1.end(), 0);
std::set_difference(m_source1.begin(), m_source1.end(), m_source2.begin(), m_source2.end(), m_dest1.begin()); //AB差集
std::for_each(m_dest1.begin(), m_dest1.end(), print_int_one);
std::cout << std::endl;
m_dest1.resize(std::max(m_source1.size(), m_source2.size()));
std::fill(m_dest1.begin(), m_dest1.end(), 0);
std::set_difference(m_source2.begin(), m_source2.end(), m_source1.begin(), m_source1.end(), m_dest1.begin()); //BA差集
std::for_each(m_dest1.begin(), m_dest1.end(), print_int_one);
std::cout << std::endl;
}
堆算法
生成堆: make_heap(iterator beg,iterator end,_pred)将指定范围内的元素生成一个堆
堆顶元素弹出: pop_heap(iterator beg,iterator end,_pred)并不真正把最大元素从堆中弹出,而是重新排序堆
新元素加入堆 push_heap(iterator beg,iterator end,_pred)要被加入到堆的元素存放在位置last-1,重新生成堆。
// 堆算法 make_heap(iterator beg,iterator end,_pred)将指定范围内的元素生成一个堆
// 堆算法 pop_heap(iterator beg,iterator end,_pred)并不真正把最大元素从堆中弹出,而是重新排序堆
// 堆算法 push_heap(iterator beg,iterator end,_pred)假设first到last-1是一个有效堆,要被加入到堆的元素存放在位置last-1,重新生成堆。
// parameter : beg-开始迭代器 end-结束迭代器 _pred-仿函数
void heap_test()
{
std::vector<int> m_source{1, 3, 2, 4, 1, 5, 7, 3, 7, 4, 7, 8};
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl
<< "min" << std::endl;
std::make_heap(m_source.begin(), m_source.end(), [](int a, int b) { return a > b; });
// std::make_heap(m_source.begin(), m_source.end(), [](int a, int b) { return a < b; });
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl
<< "pop min" << std::endl;
std::pop_heap(m_source.begin(), m_source.end(), [](int a, int b) { return a > b; }); //与建堆顺序保持一致
// std::pop_heap(m_source.begin(), m_source.end(), [](int a, int b) { return a <b; }); //与建堆顺序保持一致
m_source.pop_back();
std::for_each(m_source.begin(), m_source.end(), print_int_one);
std::cout << std::endl
<< "push val" << std::endl;
m_source.emplace_back(10);
std::push_heap(m_source.begin(), m_source.end(), [](int a, int b) { return a > b; }); //与建堆顺序保持一致
std::push_heap(m_source.begin(), m_source.end(), [](int a, int b) { return a < b; }); //与建堆顺序保持一致
std::for_each(m_source.begin(), m_source.end(), print_int_one);
}
STL常用容器
顺序性容器 vector :从后面快速插入/删除,能直接访问元素
顺序性容器 deque: 从前面/后面快速插入/删除,能直接访问元素,和vector类似
顺序性容器 list: 双链表,从任何地方快速插入/删除
关联容器 set :快速查找,不允许重复值,插入后自动排序
关联容器 multiset :快速查找,允许重复值,插入后自动排序
关联容器 map: 一对一映射,基于关键字快速查找,不允许重复值,所有元素根据键值自动排序
关联容器 multimap :一对多映射,基于关键字快速查找,允许重复值,所有元素根据键值自动排序
适配器容器 stack:后进先出
适配器容器 queue :先进先出
适配器容器 priority_queue :优先级队列 最高优先级的元素先出列
这些容器的操作无非就是front(),back(),size(),empty(),insert(),erase(),clear(),resize(),push_back(),pop_back(),top()等,主要看个vector功能,其他的基本一致(适配器容器除外)
打印数据
//打印单个数据
void print_int_one(int val)
{
std::cout << val << ' ';
}
//打印map数据
void print_map_two(std::pair<int, std::string> pit)
{
std::cout << pit.first << ':' << pit.second << ' ';
}
vector
// 顺序性容器 vector 从后面快速插入/删除,能直接访问元素
// 优点:连续存储、动态扩展、随机访问
// 缺点:只能在尾部进行插入/删除,动态添加超过默认分配大小时要进行内存再分配,消耗性能,建议创建vector时就指定空间大小
void C_STL_Vector()
{
//初始化
std::vector<int> m_container1(10); //初始化容器大小为10,默认填充0
std::cout << "m_container1: ";
std::for_each(m_container1.begin(), m_container1.end(), print_int_one);
std::vector<int> m_container2(10, 2); //初始化容器大小为10,默认填充2
std::cout << std::endl
<< "m_container2: ";
std::for_each(m_container2.begin(), m_container2.end(), print_int_one);
std::vector<int> m_container3{1, 2, 3, 4, 5, 6, 7, 8}; //初始并定义容器元素
std::cout << std::endl
<< "m_container3: ";
std::for_each(m_container3.begin(), m_container3.end(), print_int_one);
std::vector<int> m_container4(m_container3); //拷贝构造,将m_container3的元素拷贝给m_container4
std::cout << std::endl
<< "m_container4: ";
std::for_each(m_container4.begin(), m_container4.end(), print_int_one);
std::vector<int> m_container5(m_container3.begin(), m_container3.end() - 1); //拷贝构造m_container3中的部分元素
std::cout << std::endl
<< "m_container5: ";
std::for_each(m_container5.begin(), m_container5.end(), print_int_one);
std::cout << std::endl;
//功能
std::vector<int> m_container{1, 2, 3, 4, 5, 6, 7, 8, 9};
m_container.push_back(100); //尾部插入,构造后再插入
m_container.emplace_back(101); //尾部插入,原地插入,没有拷贝规程,更高效
std::for_each(m_container.begin(), m_container.end(), print_int_one);
std::cout << std::endl;
std::cout << "first: " << m_container.front() << std::endl; //首个元素
std::cout << "last: " << m_container.back() << std::endl; //最后一个元素
std::cout << "size: " << m_container.size() << std::endl; //容器大小
std::cout << "empty: " << m_container.empty() << std::endl; //是否为空
std::cout << "capacity: " << m_container.capacity() << std::endl; //容器容量,和大小不是一个概念
m_container.insert(m_container.begin() + 1, 3, 10); //在m_container[1]后面插入3个值为10的元素
std::for_each(m_container.begin(), m_container.end(), print_int_one);
std::cout << std::endl;
m_container.erase(m_container.begin() + 1, m_container.begin() + 5); //在删除m_container[1]到m_container[5]之间的元素,不包括m_container[5]
std::for_each(m_container.begin(), m_container.end(), print_int_one);
std::cout << std::endl;
m_container.clear(); //清空容器
std::cout << "size: " << m_container.size() << std::endl;
std::cout << std::endl;
m_container.resize(5); //重设容器大小
std::cout << "size: " << m_container.size() << std::endl;
}
deque
//顺序性容器 deque 从前面/后面快速插入/删除,能直接访问元素,和vector类似
void C_STL_Deque()
{
std::deque<int> m_container{1, 2, 3, 4, 5, 6}; //初始化同vector
m_container.push_back(100); //尾添
m_container.push_front(101); //首添
std::for_each(m_container.begin(), m_container.end(), print_int_one);
std::cout << std::endl;
m_container.pop_back(); //尾删
m_container.pop_front(); //首删
std::for_each(m_container.begin(), m_container.end(), print_int_one);
std::cout << std::endl;
//其他功能同vector
}
list
//顺序性容器 list 双链表,从任何地方快速插入/删除
void C_STL_List()
{
std::list<int> m_container{1, 2, 3, 4, 5}; //初始化同vector
m_container.remove_if([](int val) { return val > 3; }); //删除值大于3的元素
std::for_each(m_container.begin(), m_container.end(), print_int_one);
std::cout << std::endl;
m_container.remove(1); //删除值为1的元素
std::for_each(m_container.begin(), m_container.end(), print_int_one);
std::cout << std::endl;
//其他功能同vector
}
set/multiset
//关联容器 set 快速查找,不允许重复值,插入后自动排序
//关联容器 multiset 快速查找,允许重复值
void C_STL_set()
{
std::set<int> m_container{1, 2, 3, 1, 3, 4, 5, 5}; //初始化同vector,不能有重复值
std::for_each(m_container.begin(), m_container.end(), print_int_one);
std::cout << std::endl;
std::multiset<int> m_container1{1, 2, 2, 3, 1, 3, 4, 2, 7}; //初始化同vector,可以有重复值
std::for_each(m_container1.begin(), m_container1.end(), print_int_one);
std::cout << std::endl;
//其他功能同vector
}
map/multimap
//关联容器 map 一对一映射,基于关键字快速查找,不允许重复值,所有元素根据键值自动排序
//关联容器 multimap 一对多映射,基于关键字快速查找,允许重复值
void C_STL_map()
{
std::map<int, std::string> m_container{{1, "gxf"}, {2, "mko"}, {5, "gxf"}, {1, "erf"}, {6, "sdf"}}; //除了元素数量不一样,初始化同vector
std::for_each(m_container.begin(), m_container.end(), print_map_two);
std::cout << std::endl;
m_container.insert(std::pair<int, std::string>(3, "wse"));
std::for_each(m_container.begin(), m_container.end(), print_map_two);
std::cout << std::endl;
std::multimap<int, std::string> m_container1{{1, "gxf"}, {2, "mko"}, {1, "gxf"}, {1, "erf"}, {6, "sdf"}}; //除了元素数量不一样,初始化同vector
std::for_each(m_container1.begin(), m_container1.end(), print_map_two);
std::cout << std::endl;
//其他功能同vector,通过键值进行索引
}
stack
//适配器容器 stack 后进先出
void C_STL_stack()
{
std::stack<int> m_container;
m_container.push(1); //元素入栈
m_container.push(2);
m_container.push(3);
m_container.push(4);
m_container.push(5);
std::cout << m_container.top() << std::endl; //返回栈顶元素
std::cout << m_container.size() << std::endl; //栈大小
std::cout << m_container.empty() << std::endl; //栈是否为空
m_container.pop(); //删除栈顶元素
std::cout << m_container.top() << std::endl; //返回栈顶元素
//不提供任何遍历方法
}
queue
//适配器容器 queue 先进先出
void C_STL_queue()
{
std::queue<int> m_container;
m_container.push(1); //元素入队尾
m_container.push(2);
m_container.push(3);
m_container.push(4);
m_container.push(5);
std::cout << m_container.back() << std::endl; //队尾元素
std::cout << m_container.front() << std::endl; //队首元素
std::cout << m_container.size() << std::endl; //队列大小
std::cout << m_container.empty() << std::endl; //队列是否为空
m_container.pop(); //删除队首元素
std::cout << m_container.front() << std::endl; //返回队首元素
//不提供任何遍历方法
}
priority_queue
//适配器容器 priority_queue 优先级队列 最高优先级的元素先出列
struct m_struct1 {
int age;
std::string name;
friend bool operator<(m_struct1 m1, m_struct1 m2)
{
return m1.age < m2.age;
}
};
struct m_struct2 {
int age;
std::string name;
};
void C_STL_priority_queue()
{
std::priority_queue<int> m_container; //默认递减
// std::priority_queue<int, std::vector<int>, std::less<int> > m_container2;//默认优先级
// std::priority_queue<int, std::vector<int>, std::greater<int> > m_container3;
//结构体类型 第一种方案
std::priority_queue<m_struct1> m_container2;
m_struct1 m1{10, "gfx"};
m_struct1 m2{18, "zlw"};
m_struct1 m3{8, "fhy"};
m_container2.push(m1); //入队列
m_container2.push(m2);
m_container2.push(m3);
while (!m_container2.empty()) { //是否为空
std::cout << m_container2.top().name << ":" << m_container2.top().age << ' '; //队首元素
m_container2.pop(); //删除队首元素
}
std::cout << std::endl;
auto cmp = [](m_struct2 a, m_struct2 b) { return a.age < b.age; };
std::priority_queue<m_struct2, std::vector<m_struct2>, decltype(cmp)> m_container3(cmp);
m_struct2 m11{10, "gfx"};
m_struct2 m22{18, "zlw"};
m_struct2 m33{8, "fhy"};
m_container3.push(m11);
m_container3.push(m22);
m_container3.push(m33);
while (!m_container3.empty()) {
std::cout << m_container3.top().name << ":" << m_container3.top().age << ' ';
m_container3.pop();
}
std::cout << std::endl;
//不提供任何遍历方法
}