简介
sort
//对容器内容进行排序
random_shuffle
//洗牌,指定范围内的元素随机调整次序
merge
//容器元素合并,并存储到另一容器中
reverse
//翻转指定范围的元素
sort
函数原型
sort(iterator begin,iterator end,_Pred)
void print(int val)
{
cout << val << " ";
}
class Greater
{
public:
bool operator()(int val1,int val2)
{
return val1 > val2;
}
};
void test01()
{
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(5);
v.push_back(3);
v.push_back(4);
v.push_back(6);
sort(v.begin(), v.end()); //默认排序从小到大
for_each(v.begin(), v.end(), print); //1 2 3 4 5 6
cout << endl;
sort(v.begin(), v.end(), Greater()); //利用仿函数,实现降序排列
for_each(v.begin(), v.end(), print);// 6 5 4 3 2 1
}
sort函数默认从小到大排序,但是可以通过仿函数来实现从大到小排序。
random_shuffle
函数原型
random_shuffle(iterator begin,iterator end)
洗牌 指定范围内的元素随机调整次序
void print(int val)
{
cout << val << " ";
}
void test01()
{
srand((unsigned int)time(NULL));
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i + 1);
}
random_shuffle(v.begin(), v.end()); //洗牌算法
for_each(v.begin(), v.end(), print); // 9 2 10 3 1 6 8 4 5 7
}
这个例子我们加入了随机数种子,需要包含头文件<ctime>。这种随机打乱顺序的算法可以用来模拟生活中抽签的例子。
merge
函数原型
merge(iterator begin1,iterator end1,iterator begin2,iterator end2,dest)
作用:两个有序容器合并到一个容器中
begin1、end1 分别是源容器1的起始迭代器和终止迭代器
begin2、end2 分别是另一个源容器2的起始迭代器和终止迭代器
dest 目标容器的起始迭代器
void print(int val)
{
cout << val << " ";
}
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i + 1);
v2.push_back(i + 5);
}
//目标容器
vector<int> vtarget;
vtarget.resize(v1.size() + v2.size()); //给目标容器分配空间
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin());
for_each(vtarget.begin(), vtarget.end(), print); //1 2 3 4 5 5 6 6 7 7 8 8 9 9 10 10 11 12 13 14
}
在使用merge算法的时候要注意:
- merge算法自只能对于有序的序列使用,并且两个原容器的顺序应该相同,不能是一个升序一个降序。
- 目标容器要提前开辟空间,否则无法进行合并。
reverse
函数原型
reverse(iterator begin,iterator end);
反转指定范围的元素
void print(int val)
{
cout << val << " ";
}
void test01()
{
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i + 1);
}
cout << "反转前:" << endl;
for_each(v1.begin(), v1.end(), print); //1 2 3 4 5 6 7 8 9 10
cout << endl;
reverse(v1.begin(), v1.end());
cout << "反转后:" << endl;
for_each(v1.begin(), v1.end(), print); //10 9 8 7 6 5 4 3 2 1
}