#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;
}
程序运行结果如下