浅显算法algorithm以及初始化列表initializer_list模板

#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<list>
#include<cctype>
#include<map>
#include<set>
#include<array>
#include<valarray>
#include<initializer_list>
#include<string>
#include<iterator>
#include<cmath>
#include"windows.h"
using namespace std;
double Sqrt(const int &n){ return sqrt(n); }
void show(const vector<int> &v)
{
	for (auto x : v)
		cout << x << " ";
	cout << endl;
}
void show(const list<string> &li)
{
	for (auto l : li)
		cout << l << " ";
	cout << endl;
}
double aver(const initializer_list<int> &in);
int main()
{
	string words;
	cout << "please input a word: ";
	getline(cin, words);
	cout << "Its permutation have: \n";
	sort(words.begin(), words.end());
	cout << words << endl;
	while (next_permutation(words.begin(), words.end()))
		cout << words << endl;
	vector<int>v1{ 2, 4, 1, 5, 2 };
	cout << "Original v1: ";
	show(v1);
	replace(v1.begin(), v1.end(), 2, 7);
	cout << "use 7 to replace 2 in v1: ";
	show(v1);
	vector<int>v2;
	replace_copy(v1.begin(), v1.end(), insert_iterator<vector<int>>(v2, v2.begin()), 7, 10);
	cout << "Original v2: ";
	show(v2);
	char *str[] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
	list<string>li(str,str+7);
	cout << "Original li: ";
	show(li);
	li.remove("Thursday");//list类方法同时改变链表长度
	cout << "li.remove(): ";
	show(li);
	list<string>::iterator it;
	it = remove(li.begin(), li.end(), "Thurday");//不改变链表的长度产生返回一个新的超尾,所有元素前移
	li.erase(it, li.end());
	cout << "After remove(): ";
	show(li);
	vector<string> s { "Monday", "Tuesday", "Tuesday", "Monday" };
	map<string,int>m;
	set<string>t(s.begin(), s.begin() + 4);
	set<string>::iterator ist;
	for (ist = t.begin(); ist != t.end(); ist++)
		m[*ist] = count(s.begin(), s.end(), *ist);
	//m.insert(pair<string,int>(*ist,count(s.begin(), s.end(), *ist)))
	for (auto elem : m)
		cout << elem.first << "," << elem.second << endl;
	int num[] = { 2, 3, 6, 1, 5, 8 };
	vector<int>v3(num, num + 5);
	v3.push_back(8);
	sort(v3.begin(), v3.end());
	transform(v3.begin(), v3.end(), ostream_iterator<double,char>(cout," "), Sqrt);
	//对于vector来说貌似transform不能直接利用sqrt<int>,对于list<int>可以
	cout << endl;
	valarray<int>val(v3.size());
	int i = 0;
	for (int e : num)
		val[i++] = e;
	for (int va : val)
		cout << va << " ";
	cout << endl;
	valarray<int>temp(v3.size());
	temp = sqrt(val);//valarray类重载了大部分运算符
	for (int tem : temp)
		cout << tem << " ";
	cout << endl;
	//对于valarray类可以用slice(起始索引,索引数,跨距)函数去转变维数
	temp[slice(1, 3, 2)] = rand() % 10;
	for (int tem : temp)
		cout << tem << " ";
	cout << endl;
	initializer_list<int>init = { 2, 3, 5, 2, 1 };
	cout << "Average: " << aver(init) << endl;
  system("pause");
  return 0;
}

double aver(const initializer_list<int> &in)
{
	int size = in.size();
	int sum = 0;
	if (size > 0)
	{
		for (auto p = in.begin(); p != in.end(); p++)
			sum += *p;
		return sum*1.0 / size;
	}
	else return 0;
}

程序运行结果如下

猜你喜欢

转载自blog.csdn.net/weixin_43871369/article/details/85761807