STL標準ライブラリのアルゴリズム(修正シーケンスアルゴリズムの詳細説明) 変換、分割、生成関数の具体的な応用

このブログでは主に補正シーケンスのアルゴリズムを紹介していますが、補正シーケンスのアルゴリズムの一部の操作によりコンテナの内容が変更されます。たとえば、コンテナの一部を同じコンテナの別の部分にコピーしたり、コンテナに指定された値を入力したりすることができます。

以下は STL 修正シーケンス アルゴリズム テーブルです。

パラメータ 説明する
コピー(最初、最後、最初2) コピー
copy_backward(最初、最後、最後2) 逆レプリケーション
fill(first,last,val) コンテナに val の値を入れます
生成(最初、最後、機能) 指定されたアクション操作の結果をコンテナに格納します。
パーティション(最初、最後、前) 分割ポイント(偶数など)でコンテナを分割します。
ランダムシャッフル(最初、最後) ランダムな並べ替え
削除(最初、最後、値) 要素を削除せずに削除する
replace(最初、最後、val、val2)

val を val2 に置き換えます

リテート(最初、真ん中、最後) 回転する
逆(最初、最後) コンテナ内の要素を反転します
スワップ(it1,it2) 2 つのコンテナの要素を交換します
変換(最初、最後、最初2、関数) 2 つのコンテナに基づいて、インタラクションにより 3 番目のコンテナが生成されます。
一意(最初、最後) 繰り返される要素を一意にする
swap_ranges(最初、最後、最初) 指定した範囲を置き換えます

具体的な実装コードは以下の通りです。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int val)
{
	cout << val << " ";	
} 

int Sum(int a,int b)
{
	return a + b;
}

int random()
{
	return rand() % 100 + 1;
}

bool op(int i)
{
	return i % 2 == 0;
}

int main()
{
	vector<int> ivc1,ivc2;
	cout << "请输入ivc1(ivc2)的元素个数:" << endl;
	int n,x;
	cin >> n; 
	cout << "请输入ivc1的元素个数:" << endl;
	for(int i = 0; i < n; i++)
	{
		cin >> x;
		ivc1.push_back(x);
	}
	cout << "请输入ivc2的元素个数:" << endl;
	for(int i = 0; i < n; i++)
	{
		cin >> x;
		ivc2.push_back(x);
	}
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);
	cout << endl;
	cout << "ivc2:" << endl;
	for_each(ivc2.begin(),ivc2.end(),print);
	cout << endl << endl;
	
	//using copy()
	cout << "After copy():" << endl;
	copy(ivc1.begin(),ivc1.end(),ivc2.begin());
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	//将ivc1复制给ivc2 
	cout << endl;
	cout << "ivc2:"<<endl;
	for_each(ivc2.begin(),ivc2.end(),print);
	cout << endl << endl;
	
	//using reverse
	cout << "After reverse():" << endl;
	reverse(ivc1.begin(),ivc1.end());
	cout << "ivc1:" << endl;		//对ivc1进行颠倒 
	for_each(ivc1.begin(),ivc1.end(),print);
	cout << endl << endl;
	
	//using random_shuffle()
	cout << "After random_shuffle():" << endl;
	random_shuffle(ivc2.begin(),ivc2.end());
	cout << "ivc2:" << endl;		//对ivc2随机排序 
	for_each(ivc2.begin(),ivc2.end(),print);
	cout << endl << endl;
	
	//using unique()
	cout << "After unique():" << endl;
	unique(ivc1.begin(),ivc1.end());
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	//变成与末尾相同的元素 
	cout << endl << endl;
	
	//using swap()
	cout << "After swap():" << endl;
	swap(ivc1,ivc2);		//交换ivc1和ivc2中的元素 
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl;
	cout << "ivc2:" << endl;
	for_each(ivc2.begin(),ivc2.end(),print);	 
	cout << endl << endl;
	
	//using transform
	cout << "After transform():" << endl;
	vector<int> ivc3;
	ivc3.resize(n);			//需要提前给ivc3一个容器大小否则transform保存不住数据 
	transform(ivc1.begin(),ivc1.end(),ivc2.begin(),ivc3.begin(),Sum); 
	cout << "ivc3:" << endl;
	for_each(ivc3.begin(),ivc3.end(),print);	
	cout << endl << endl;
	
	//using copy_backward()
	cout << "After copy_backward():" << endl;
	vector<int> ivc4;
	ivc4.resize(n);
	copy_backward(ivc1.begin(),ivc1.end(),ivc4.end());
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl; 
	cout << "ivc4:" << endl;
	for_each(ivc4.begin(),ivc4.end(),print);	
	cout << endl << endl; 
	
	//using fill()
	cout << "After fill():" << endl;
	fill(ivc4.begin(),ivc4.end(),8);
	cout << "ivc4:" << endl;
	for_each(ivc4.begin(),ivc4.end(),print);	
	cout << endl << endl;
	
	//using generate()
	cout << "After generate():" << endl;
	generate(ivc4.begin(),ivc4.end(),random);	//产生随机数给ivc4 
	cout << "ivc4:" << endl;
	for_each(ivc4.begin(),ivc4.end(),print);	
	cout << endl << endl;
	
	//using remove()
	cout << "After remove():" << endl;
	remove(ivc1.begin(),ivc1.end(),3);	//移除ivc1中值为3的元素 
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl << endl;
	
	//using replace()
	cout << "After replace():" << endl;
	replace(ivc1.begin(),ivc1.end(),5,77);	//将5的值改为77 
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl << endl; 
	
	//using rotate()
	cout << "After rptate():" << endl;
	rotate(ivc1.begin(),ivc1.begin()+3,ivc1.end());	//旋转ivc1 
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl << endl;
	
	//using partition()
	/*
 *  partition 参数介绍
 *  1. begin迭代器
 *  2. end 迭代器 注意是前开后闭的 [begin, end)
 *  3. pred 是个 callable 类型, 签名如 bool(int v);
 *     partition的返回值q指向第一个不满足 pred 的位置,
 *     最终[begin, q) 符合pred, [q, end) 不符合
 * */
	cout << "After partition():" << endl;
	vector<int>::iterator it;
	vector<int>::iterator bound;
	it = partition(ivc1.begin(),ivc1.end(),op);
	cout << "odd elements:" << endl;
 	for(bound = ivc1.begin(); bound != it; bound++)
 		cout << *bound << " ";
	cout << endl;	
	cout << "even elements:" << endl;
	for( bound = it; bound != ivc1.end(); bound++)
 		cout << *bound << " ";	
	return 0;
}

具体的な操作結果を図に示します。

 

 

 

 

 

おすすめ

転載: blog.csdn.net/m0_61886762/article/details/124211611