遍历
#include<vector>
#include<iostream>
#include<algorithm>
class MyPrint
{
public:
void operator()(int val)
{
std::cout << val << " ";
}
};
//for_each
void test01()
{
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(i);
}
std::for_each(vec.begin(), vec.end(), MyPrint());
std::cout << std::endl;
}
//transform
void test02()
{
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(i);
}
std::vector<int> vet;
std::transform(vec.begin(), vec.end(), std::back_inserter(vet), [](int val) {
return val * 2;
});
for (auto& val : vet)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
//int main()
//{
// test01();
// test02();
//}
查找
#include<vector>
#include<iostream>
#include<algorithm>
#include<random>
#include<string>
//find
void test01()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 100);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
auto it = std::find(vec.begin(), vec.end(), 5);
if (it == vec.end())
{
std::cout << "没有找到" << std::endl;
}
else
{
std::cout << "找到" << *it << std::endl;
}
}
class Person
{
private:
std::string m_name;
int m_age;
public:
Person(std::string name, int age) :m_name(name), m_age(age) {
};
friend std::ostream& operator<<(std::ostream& os, const Person& p) {
os << "姓名: " << p.m_name << ", 年龄: " << p.m_age;
return os;
}
bool operator==(Person p)
{
if (this->m_name == p.m_name && this->m_age == p.m_age)
{
return true;
}
else
{
return false;
}
}
};
void test02()
{
std::vector<Person> vec;
Person p1("lh", 19);
Person p2("lb", 29);
Person p3("lg", 39);
Person p4("lk", 49);
Person p5("lo", 59);
vec.push_back(p1);
vec.push_back(p2);
vec.push_back(p3);
vec.push_back(p4);
vec.push_back(p5);
for (auto& val : vec)
{
std::cout << val << std::endl;
}
auto it = std::find(vec.begin(), vec.end(), p2);
if (it == vec.end())
{
std::cout << "没有找到" << std::endl;
}
else
{
std::cout << "找到" << *it << std::endl;
}
}
//find_if
class GreateFive
{
public:
bool operator()(int val)
{
return val > 5;
}
};
void test03()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 10);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
auto it = std::find_if(vec.begin(), vec.end(), GreateFive());
if (it == vec.end())
{
std::cout << "没有找到" << std::endl;
}
else
{
std::cout << "找到" << *it << std::endl;
}
}
//adjanent_find 第一个相邻重复元素
void test04()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 9);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
auto it = std::adjacent_find(vec.begin(), vec.end());
if (it == vec.end())
{
std::cout << "没有找到" << std::endl;
}
else
{
std::cout << "找到" << *it << std::endl;
}
}
//binary_search 查找指定元素是否存在 无序序列不可用
void test05()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 100);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(i);
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
auto it = std::binary_search(vec.begin(), vec.end(),9);
if (!it)
{
std::cout << "没有找到" << std::endl;
}
else
{
std::cout << "找到" << std::endl;
}
}
//count 统计元素个数
void test06()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 10);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
auto it = std::count(vec.begin(), vec.end(), 5);
std::cout << it;
}
//count if
void test07()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 10);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
auto it = std::count_if(vec.begin(), vec.end(), GreateFive());
std::cout << it;
}
int main()
{
//test01();
//test02();
//test03();
//test04();
//test05();
//test06();
test07();
}
排序
#include<vector>
#include<iostream>
#include<algorithm>
#include<random>
#include<string>
#if 0
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 100);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
auto it = std::find(vec.begin(), vec.end(), 5);
#endif
//sort
void test01()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 100);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
std::sort(vec.begin(), vec.end());
for (auto& val : vec)
{
std::cout << val << " ";
}
}
//random_shuffle 打乱排序
void test02()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 100);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
for (int i = 0;i < 3;i++)
{
std::random_shuffle(vec.begin(), vec.end());
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
std::sort(vec.begin(), vec.end());
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
}
//merge 合并两个容器到新容器,两个容器必须有序
void test03()
{
std::vector<int> v1, v2;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
}
for (int i = 10;i >20;i++)
{
v2.push_back(i);
}
std::vector<int> v3;
v3.resize(v1.size()+v2.size());
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
for (auto& val:v3)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
//reverse 反转容器
void test04()
{
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(i);
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
std::reverse(vec.begin(), vec.end());
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
int main()
{
//test01();
//test02();
//test03();
test04();
}
拷贝和替换
#include<vector>
#include<iostream>
#include<algorithm>
#include<random>
#include<string>
//copy 容器内指定范围的元素拷贝到另一容器
void test01()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 100);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
std::vector<int> vet;
vet.resize(vec.size());
std::copy(vec.begin(), vec.end(), vet.begin());
for (auto& val : vet)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
//replace 将容器内指定范围的旧元素修改为新元素
void test02()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 9);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
std::replace(vec.begin(), vec.end(), 5,10);
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
//replace_if 将容器内指定范围满足条件的旧元素修改为新元素
class LessFive
{
public:
bool operator()(int val)
{
return val < 5;
}
};
void test03()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 9);
std::vector<int> vec;
for (int i = 0;i < 10;i++)
{
vec.push_back(dist(gen));
}
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
std::replace_if(vec.begin(), vec.end(), LessFive(), 7);
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
//swap 互换两个容器的内容
void test04()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 100);
std::vector<int> v1,v2;
for (int i = 0;i < 10;i++)
{
v1.push_back(dist(gen));
v2.push_back(dist(gen));
}
for (auto& val : v1)
{
std::cout << val << " ";
}
std::cout << std::endl;
for (auto& val : v2)
{
std::cout << val << " ";
}
std::cout << std::endl;
std::swap(v1, v2);
for (auto& val : v1)
{
std::cout << val << " ";
}
std::cout << std::endl;
for (auto& val : v2)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
int main()
{
//test01();
//test02();
//test03();
test04();
}
算术生成
#include<vector>
#include<iostream>
#include<algorithm>
#include<random>
#include<string>
#include<numeric>
//生成n位在min到max范围内的随机数的vector
std::vector<int> random(int n,int min,int max)
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(min, max);
std::vector<int> vec;
for (int i = 0;i < n; i++)
{
vec.push_back(dist(gen));
}
return vec;
}
//accumulate计算容器内元素数量和
void test01()
{
std::vector<int> vec = random(10, 1, 10);
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
auto sum = std::accumulate(vec.begin(), vec.end(), 0); //起始值
std::cout << "总和为" << sum << std::endl;
}
//fill向容器填充元素
void test02()
{
std::vector<int> vec;
vec.resize(10);
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
std::fill(vec.begin(), vec.end(), 6);
for (auto& val : vec)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
int main()
{
test01();
test02();
}
集合算法
#include <vector>
#include <iostream>
#include <algorithm>
#include <random>
#include <string>
#include <numeric>
class Myprintf {
public:
void operator()(int val)
{
std::cout << val << " ";
}
};
// set_intersection求两个容器的交集 必须有序
void test01()
{
std::vector<int> v1;
std::vector<int> v2;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
v2.push_back(i + 1);
}
std::vector<int> vec;
vec.resize(std::min(v1.size(), v2.size()));
auto val = std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vec.begin());
std::for_each(vec.begin(), val, Myprintf());
std::cout << std::endl;
}
//set_union 求两个元素的并集 必须有序
void test02()
{
std::vector<int> v1;
std::vector<int> v2;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
v2.push_back(i + 1);
}
std::vector<int> vec;
vec.resize(v1.size()+v2.size());
auto val = std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vec.begin());
std::for_each(vec.begin(), val, Myprintf());
std::cout << std::endl;
}
//set_difference 求两个集合的差集 必须有序
void test03()
{
std::vector<int> v1;
std::vector<int> v2;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
v2.push_back(i + 1);
}
std::vector<int> vec;
vec.resize(v1.size() + v2.size());
auto val = std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vec.begin());
std::for_each(vec.begin(), val, Myprintf());
std::cout << std::endl;
}
int main()
{
test01();
test02();
test03();
return 0;
}