IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++中的算法(二):变动性算法 -> 正文阅读

[C++知识库]C++中的算法(二):变动性算法

在STL中,提供诸多完善的算法,能够对所作用的容器进行修改的算法称为变动性算法。

改变容器中元素值的一般包括两种方法:
(1)使用迭代器遍历序列过程中,直接改变元素的值
(2)在元素复制过程中,改变元素的值
变动性算法主要包含8种,分别是:
复制、转换、互换、赋值、替换、逆转、旋转、排序。

1 复制

int dim[] = { 1,3,5,7,9,2,4,6,8 };
vector<int>v1;
v1.assign(dim, dim + 9);//全部复制,将数组转换为vector
cout << "v1:" << endl;
for_each(v1.begin(), v1.end(), OutToScreen);
cout << endl;
list<int>L1, L2;
copy(v1.begin(), v1.end(),back_inserter(L1));//将其复制到L1中
cout << "L1:" << endl;
for_each(L1.begin(), L1.end(), OutToScreen);
cout << endl;
//L2 = L1;//第一种赋值
//copy(dim, dim + 9, back_inserter(L2));//第二种赋值
L2.assign(dim, dim + 9);//第三种赋值
cout << "L2:" << endl;
copy(L2.begin(), L2.end(), ostream_iterator<int>(cout, " "));
cout << endl;

在这里插入图片描述

2 转换

template<class T>class customFun {//一个参数的仿函数例子
public:
	T parm;
	customFun(const T& val):parm(val){}
	int operator()(T& elem)const {
		return(elem * parm);
	}
};
template<class T>class customFun2 {//两个参数的仿函数例子
public:
	T parm;
	customFun2(const T& val) :parm(val) {
	};
	int operator()(T& elem, T& elem2)const {
		return(elem + elem2) * parm;
	}
};
//转换 transform
//将源区间的元素复制到目标区间,复制和修改元素一气呵成,还能将两个区间的元素合并,并将结果写入目标区间
int dim[] = { 1,3,5,7,9,2,4,6,8 };
vector<int>v1;
v1.assign(dim, dim + 9);//全部复制将数组转换为vector
list<int>L1, L2,L3;
cout << "L1:" << endl;
copy(v1.begin(), v1.end(), back_inserter(L1));
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "L2=-1*L1:" << endl;
transform(v1.begin(), v1.end(), back_inserter(L2), negate<int>());
copy(L2.begin(), L2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "L1*L2:改变L2" << endl;
transform(L1.begin(), L1.end(), L2.begin(), L2.begin(), multiplies<int>());
copy(L2.begin(), L2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "L1=10*L1:" << endl;
transform(L1.begin(), L1.end(), L1.begin(), bind2nd(multiplies<int>(), 10));
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "L1翻转并取负数:" << endl;
transform(L1.rbegin(), L1.rend(), ostream_iterator<int>(cout, " "), negate<int>());
cout << endl;
cout << "L2/2:" << endl;
transform(L2.begin(), L2.end(), ostream_iterator<int>(cout, " "), bind2nd(divides<int>(), 2));//如果
cout << endl << endl;
cout << "L1:" << endl;
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "L2:" << endl;
copy(L2.begin(), L2.end(), ostream_iterator<int>(cout, " "));
cout << endl << endl;
cout << "L1+L2" << endl;
transform(L1.begin(), L1.end(), L2.begin(), ostream_iterator<int>(cout, " "), plus<int>());
cout << endl;
cout << "L1-L2" << endl;
transform(L1.begin(), L1.end(), L2.begin(), ostream_iterator<int>(cout, " "), minus<int>());
cout << endl;
cout << "L1*L2" << endl;
transform(L1.begin(), L1.end(), L2.begin(), ostream_iterator<int>(cout, " "), multiplies<int>());
cout << endl;
cout << "L1/L2" << endl;
transform(L1.begin(), L1.end(), L2.begin(), ostream_iterator<int>(cout, " "), divides<int>());
cout << endl;
cout << "L3=L1+2" << endl;
transform(L1.begin(), L1.end(), back_inserter(L3), bind2nd(plus<int>(), 2));
copy(L3.begin(), L3.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "自定义一个参数的仿函数例子 L1*4" << endl;
transform(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "), customFun<int>(4));
cout << endl;
cout << "自定义两个参数的仿函数例子实现相加再相乘 (L1+L2)*3" << endl;
transform(L1.begin(), L1.end(), L2.begin(), ostream_iterator<int>(cout, " "), customFun2<int>(3));
cout << endl;

在这里插入图片描述

3 互换

int dim1[] = { 1,2,3,4,5,6,7,8,9 };
int dim2[] = { 11,12,13,14,15,16,17,18,19 };
vector<int>v1;
vector<int>v2;
v1.assign(dim1, dim1 + 9);
copy(dim2, dim2 + 9, back_inserter(v2));
cout << "v1:" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "v2:" << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
swap(v1, v2);
cout << "v1与v2全部交换后" << endl;//只能全部都交换
cout << "v1:" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "v2:" << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
swap_ranges(v1.begin(), v1.begin() + 5, v2.begin());//可以定长交换,[v1.begin(), v1.begin() + 5]是交换的区间, v2.begin()开始交换的起点
cout << "v1与v2前面五个元素进行交换后" << endl;
cout << "v1:" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "v2:" << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;

在这里插入图片描述

4 赋值

int Fib(void) {
	static int sum = 0;
	static int r = 0;
	sum += r;
	r++;
	return(sum);
}
//赋值 
vector<int>v1;
vector<int>v2;
vector<int>v3;
int dim1[] = { 1,2,3,4,5,6,7,8,9 };
v1.assign(dim1, dim1 + 9);
copy(v1.begin(), v1.end(), back_inserter(v2));
v3 = v1;
cout << "v1" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//fill的使用方法
fill(v1.begin(), v1.begin() + 5, 0);//将v1前面五个数赋值为0
cout << "将v1前面五个数赋值为0" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//fill_n的使用方法
fill_n(v1.begin(), 4, 10);//将v1前面4个数赋值为10
cout << "将v1前面4个数赋值为10" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//generate的使用方法
generate(v2.begin(), v2.end(), rand);
cout << "随机给v2赋值" << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//generate_n的使用方法
generate_n(v3.begin(), 3, rand);
cout << "随机给v3前三个元素赋值" << endl;
copy(v3.begin(), v3.end(), ostream_iterator<int>(cout, " "));
cout << endl;
int Fib(void);
generate_n(v3.rbegin(), 5, Fib);//自定义函数
cout << "随机给v3最后5个元素赋值" << endl;
copy(v3.begin(), v3.end(), ostream_iterator<int>(cout, " "));
cout << endl;

在这里插入图片描述

5 替换

//替换
vector<int>v1;
int dim1[] = { 1,7,3,7,5,6,7,8,9 };
v1.assign(dim1, dim1 + 9);
cout << "v1" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "将v1中等于7的值全部替换为0" << endl;
replace(v1.begin(), v1.end(), 7, 0);
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "将v1中小于5的值全部替换为10" << endl;
replace_if(v1.begin(), v1.end(), bind2nd(less<int>(), 5), 10);
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;

在这里插入图片描述

6 逆转

//逆转 将容器里面的元素按逆向顺序反转
vector<int>v1,v2;
int dim1[] = { 1,2,3,4,5,6,7,8,9 };
list<int>L1;
v1.assign(dim1, dim1 + 9);
cout << "v1" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
L1.assign(v1.begin(), v1.end());
cout << "L1" << endl;
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "逆转v1中间部分" << endl;
reverse(v1.begin() + 2, v1.end() - 2);
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "逆转L1中间部分" << endl;
//两种方式定义posf和pose都可以
//auto posf = L1.begin();
//auto pose = L1.end();
list<int>::iterator posf = L1.begin();
list<int>::iterator pose = L1.end();
//reverse(L1.begin() + 2, L1.end() - 2);//不能这样操作,list无法移动时使用加法,需要移动时使用advance函数
advance(posf, 2);
advance(pose, -2);
reverse(posf, pose);
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "逆转V1赋值给V2" << endl;
reverse_copy(v1.begin(), v1.end(), back_inserter(v2));
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "逆转V2" << endl;
reverse_copy(v2.begin()+2, v2.end()-2, ostream_iterator<int>(cout," "));
cout << endl;

在这里插入图片描述

7 旋转

//旋转
//旋转是将容器内的元素按照一个环的方式旋转
vector<int>v1,v2;
int dim1[] = { 1,2,3,4,5,6,7,8,9 };
v1.assign(dim1, dim1 + 9);
cout << "v1" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "v1第一次旋转" << endl;
rotate(v1.begin(), v1.begin() + 3, v1.end()-2);//保持后面两个不动,其他的旋转3个位置
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "v1第二次旋转" << endl;
rotate(v1.begin()+3, v1.begin() + 5, v1.end());//保持前面3个不动,其他的围城圈旋转两个位置
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "v1第三次旋转,赋值给v2" << endl;
rotate_copy(v1.begin(), v1.begin() + 2, v1.end(), back_inserter(v2));
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "v2第一次旋转" << endl;
rotate_copy(v2.begin()+2, v2.begin() + 4, v2.end()-2, ostream_iterator<int>(cout," "));
cout << endl;

在这里插入图片描述

8 排序

//排列
//排列元素 会改变容器中的元素的次序next_permutation prev_permutation 太慢了
// vector<int>v1,v2;
int dim1[] = { 1,5,9,4,6,8,7,3};
vector<int>v1;
v1.assign(dim1, dim1 + 8);
cout << "v1" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//while (next_permutation(v1.begin(), v1.end()))
//{//升序排序
//	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
//	cout << endl;
//}
//cout << "v1升序排序后" << endl;
//copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
//cout << endl << endl;
//while (prev_permutation(v1.begin(), v1.end()))
//{//降序排序
//	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
//	cout << endl;
//}
//cout << "v1降序排序后" << endl;
//copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
//cout << endl << endl;
//while (prev_permutation(v1.begin(), v1.end()))
//{//降序排序
//	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
//	cout << endl;
//}
//cout << "v1再次降序排序后" << endl;
//copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
//cout << endl;
//重排元素 对容器内的元素随机排序
cout << "打乱v1中的次序" << endl;
random_shuffle(v1.begin(), v1.end());//常用
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "从新排序v1" << endl;
sort(v1.begin(), v1.end());//升序,常用
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//向前搬移 按指定的一元判断式向前搬移元素
vector<int>v2;
v2.push_back(3);
v2.push_back(2);
v2.push_back(7);
v2.push_back(9);
v2.push_back(6);
v2.push_back(1);
v2.push_back(4);
v2.push_back(5);
cout << "v2" << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
vector<int>::iterator pos1, pos2;
cout << "v1不排序" << endl;
pos1 = partition(v1.begin(), v1.end(), not1(bind2nd(modulus<int>(), 2)));
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "v2相对排序" << endl;
pos1 = stable_partition(v2.begin(), v2.end(), not1(bind2nd(modulus<int>(), 2)));
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:31:54  更:2021-07-28 07:35:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/29 15:56:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码