第七章 STL 及其应用

2018-01-02  本文已影响20人  DeepWeaver
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class Predicate{
private:
  int count=0;
public:
  bool operator()(int data){
    if ( count>=3 ) return false;
    else{
      bool x=(data<=20 && data%3==0);
      count+=x;
     // cout<<x<<" "<<count<<endl;
      return x;
    }
  }
};

int main(){
 Predicate predicate;
 vector<int> vec{2,4,5,6,10,15,3,21,36,72,9,13};
 vector<int> result;
 result.resize (vec.size());
// auto end=copy_if(vec.begin (),vec.end (),result.begin(),predicate);
 int count=0;
 auto end=copy_if(vec.begin (),vec.end (),result.begin()
                  ,[&count](int data)->bool{    
                      if ( count>=3 ) return false;
                      else{
                        bool x=(data<=20 && data%3==0);
                        count+=x;return x;
                      }
                    }
                  );

 result.erase(end,result.end ());
 for_each(result.begin (),result.end (),[](int e){cout<<e<<endl;});
 return 0;
}
6
15
3
[Finished in 0.4s]
#include <iostream>
#include <vector>
#include <map>
#include <functional>
#include <string>
#include <algorithm>
#include <sstream>
using namespace std;
class Student{
private:
  string name;
  string specialty;//专业
  long id;// 学号
  double creditPoint; //学分积点
public:
  Student(string n,string s,long i,double c)
  :name(n),specialty(s),id(i),creditPoint(c){}
  void setCreditPoint(double c){creditPoint=c;}
  double getCreditPoint()const{return creditPoint;}
  string getName()const{return name;}
  long getId()const{return id;}
  string getSpecialty()const{return specialty;}
  friend ostream& operator<<(ostream& out,const Student& s);
};
ostream& operator<<(ostream& out,const Student& s){
  cout<<"Name:"<<s.name<<endl;
  cout<<" Id:"<<s.id<<endl;
  cout<<" Specialty:"<<s.specialty<<endl;
  cout<<" CreditPoint:"<<s.creditPoint<<endl;
}


class StudentManage{
public:
  enum SortType{BY_NAME,BY_ID,BY_SPECIALTY,BY_CRDITPOINT};
  StudentManage()=default;
  void addStudent();
  void removeStudent();
  void setSortType(SortType st);
  void findStudent();
  int size()const{ return students.size();}
  friend ostream& operator<<(ostream& out,const StudentManage& sm);
private:
  map<long,int> idmap;  
  vector<Student> students;
  SortType sortType=BY_ID;
};void StudentManage::setSortType (SortType st){
  /*if (choice>3 || choice<0) {
    cout<<"Illigal!\n";
    return ;
  }  
  SortType st=(SortType)choice;
  cout<<st<<endl;*/
//function+lambda......666
  function<bool(const Student&,const Student&)> f;
  switch(st){
  case BY_ID: f=[](const Student& s1,const Student& s2)
  {return s1.getName()<s2.getName();};break;
  case BY_NAME:f=[](const Student& s1,const Student& s2)
  {return s1.getId()<s2.getId();};break;
  case BY_SPECIALTY:f=[](const Student& s1,const Student& s2)
  {return s1.getSpecialty()<s2.getSpecialty();};break;
  case BY_CRDITPOINT:f=[](const Student& s1,const Student& s2)
  {return s1.getCreditPoint()<s2.getCreditPoint();};break;
  }
  sort(students.begin(),students.end(),f);
}

void StudentManage::addStudent(){
  string n,s;long i;double c;
//  cout<<"Please enter the name, speciality, id ,credit point of the student:\n";
  cin>>n>>s>>i>>c;
  if (idmap.count(i)){
    cout<<"This id has existed!\n";
    return ;
  }
  else{
    idmap[i]++;
    students.push_back(Student(n,s,i,c));
    setSortType(sortType);
  }
}
void StudentManage::removeStudent(){
  cout<<"Please enter the student's id you want to remove:\n";
  long x;cin>>x;
  if (!idmap.count(x)){
    cout<<"There is no such a student!\n";
    return ;
  }
  for(auto i=students.begin();i!=students.end();++i){
    if( (*i).getId()==x ) {
      idmap.erase(x);
      students.erase(i);
      cout<<"OK!This student is removed!\n";
      return ;
    }
  }
}
void StudentManage::findStudent(){
  cout<<"Please enter a name or an id:\n";
  string n;cin>>n;
  long i;
  if (n[0]<='9' && n[0]>='0'){
    stringstream ss;ss<<n;ss>>i;
    for_each(students.begin(),students.end(),[i](Student& x){if(x.getId()==i) cout<<x<<endl;});
  } 
  else {
    for_each(students.begin(),students.end(),[&n](Student& x){if(x.getName()==n) cout<<x<<endl;});
  }
}

ostream& operator<<(ostream& out,const StudentManage& sm){
  for(auto& e:sm.students) out<<e<<endl;
  return out;
}
int main(){
/*  cout<<"Test1:\n";
  vector<Student> vec{
  {"zhang","Computer",11001,4.2},
  {"wang","Computer",11002,3.8},
  {"Li","English",12001,4.1},
  {"Tang","English",12002,3.9},
  {"Qian","Computer",11003,4.0},
  {"Song","Geology",10001,4.1}
  };
  for(auto e: vec) 
  cout<<e;
*/
  cout<<"Test2:\n";
  StudentManage sm;
  
  cout<<"Welcome to the Student Management System!\nBut can "
      <<"I must say the our teacher has less creativity in teaching...\n"
      <<"In two continuous semeters this project always is the hardest task...\n"
      <<"I only look foward there will be some intersting task in the 14-15th week.\n\n";
 

  cout<<"sort type(0-name,1-id,2-specialty,3-creditpoint):\n";
  int choice;
  cin>>choice;
  sm.setSortType (static_cast<StudentManage::SortType>(choice));

  cout<<"\nPlease enter the student number:\n";
  int n;cin>>n;

    cout<<"Please enter the name, speciality, id ,credit point of the student:\n";
    while(n--) sm.addStudent();
  cout<<sm;

  int command;
  while(1){  
    cout<<"Please enter command, 1-add,2-find,3-remove,0-exit:\n";
    cin>>command;
    if (command==0) break;
    switch(command){
      case 1:sm.addStudent();break;
      case 2:sm.findStudent();break;
      case 3:sm.removeStudent();break;
    }
   // cout<<endl<<"Now:\n";
   // cout<<sm;
  }
  cout<<"Syytem is shot down!\n";
  return 0;
}
Test2:
Welcome to the Student Management System!
But can I must say the our teacher has less creativity in teaching...
In two continuous semeters this project always is the hardest task...
I only look foward there will be some intersting task in the 14-15th week.
#include<bits/stdc++.h>
using namespace std;



int main(){
  map<string,int> count;//save as pair
  string word;
  int n;cin>>n;
  while(n--) {
    cin>>word;
    ++count[word];
  }
  for(auto e:count){//what inside map ??????
    cout<<e.first<<"\t"<<e.second<<"\n";//it's sorted as pair
  }
}
看情况
#include<iostream>
#include <map>
#include <string>
using namespace std;
#define all(x) x.begin(),x.end()
#define pb push_back

int product(int num1,int num2){
  return num1*num2;
}
double geoMean(const list<int>& nums){
  double mult=accumulate(all(nums),1,product);
  return pow(mult,1.0/nums.size());
}

int main(){
  list<int> data;
  data.pb(1);data.pb(2);data.pb(4);
  cout<<geoMean(data)<<endl;
}
#include<iostream>
#include <map>
#include <string>
#include <list>
using namespace std;
#define all(x) x.begin(),x.end()
#define pb push_back

int product(int num1,int num2){
  return num1*num2;
}
double geoMean(const list<int>& nums){
  double mult=accumulate(all(nums),1,product);
  return pow(mult,1.0/nums.size());
}

int main(){
  list<int> data;
  data.pb(1);data.pb(2);data.pb(4);
  cout<<geoMean(data)<<endl;
}
#include<iostream>
#include<algorithm>
#include<functional>

using namespace std;

using namespace std::placeholders;

int main(){
  auto divd=[](auto x,auto y){return x/y;};
  auto dint=bind<int>(divd,_1,_2);
  auto rddou=bind(divd,_2,_1);
  cout<<dint(20,6)<<endl;
  cout<<rddou((double)20,(double)6)<<endl;
}

include<iostream>

using namespace std;

int main(){
enum week{Monday,Tuesday,Wednesday};

week a=Monday;
a=(week)1;
cout<<&a<<endl;
cout<<(int)a<<endl;
cout<<a<<endl;
}

0x7ffee452bb3c
1
1
[Finished in 0.4s]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
void myfunction (int i)
{
    cout << " " << i;
}
struct myclass
{
    void operator() (int i)
    {
        cout << " " << i;
    }
} myobject;

class MeanVlaue
{
public:
    MeanVlaue():num(0),sum(0){}
    void operator() (int elem)
    {
        num++;
        sum+=elem;
    }
    double value()
    {
        return static_cast<double>(sum)/static_cast<double>(num);
    }
    operator double()//重载的好处,简洁!
    {
        return static_cast<double>(sum)/static_cast<double>(num);
    }
private:
    long num;
    long sum;
};

template<typename T1>
auto add(T1 &a)->decltype(a+10){
  return a+=10;
}

template<class T>
class AddValue
{
public:
    AddValue(const T& v):theValue(v){}
    void operator() (T& elem)const
    {
        elem+=theValue;
    }
private:
    T theValue;
};

int main()
{
    vector<int> myvector;
    myvector.push_back(10);
    myvector.push_back(20);
    myvector.push_back(30);

    cout << "myvector contains:";
    for_each (myvector.begin(), myvector.end(), myfunction);

    // or:
    cout << "\nmyvector contains:";
    for_each (myvector.begin(), myvector.end(), myobject);

    cout << endl;

    MeanVlaue mv=for_each(myvector.begin(),myvector.end(),MeanVlaue());
    cout<<"MeanValue:"<<mv.value()<<endl;

    for_each(myvector.begin(), myvector.end(), add<int>);//参数可以自己改,eg:*(myvector.begin())
    for_each (myvector.begin(), myvector.end(), myobject);
    cout << endl;

    double mv2=for_each(myvector.begin(),myvector.end(),MeanVlaue());
    cout<<"MeanValue:"<<mv2<<endl;

    return 0;
}

myvector contains: 10 20 30
myvector contains: 10 20 30
MeanValue:20
20 30 40
MeanValue:30
[Finished in 0.4s]

```java
#include<iostream>
#include<functional>
using namespace std;

template<typename T>
T use_f(T x,function<T(T)> f){
  static int count=0;
  ++count;
  cout<<"count = "<<count
      <<" &count = "<<&count<<endl;
  return f(x); 
}

class Fp{
private:
  double p;
public:
  Fp(double _p):p(_p){}
  double operator()(double x){return x*p;}
};

double dub(double u){
  return u*u;
}

int main(){

//lambda
  cout<<use_f<double>(0.5,[](double u){return u*u;})<<endl;
//class
  cout<<use_f<double>(0.5,Fp(0.5))<<endl;
//function
  cout<<use_f<double>(0.5,dub)<<endl;
}
count = 1 &count = 0x10e73c260
0.25
count = 2 &count = 0x10e73c260
0.25
count = 3 &count = 0x10e73c260
0.25
[Finished in 0.5s]
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

#define all(x) x.begin(),x.end()

int main(){
  vector<int> vec1(10,10),vec2(10,11);
  for_each(all(vec1),[](int x){cout<<x<<" ";});cout<<endl;
  cout<<0<<endl;
  transform(all(vec1),vec1.begin(),[](int x){return x*x;});
  cout<<1<<endl;
  for_each(all(vec1),[](int x){cout<<x<<" ";});cout<<endl;
  cout<<2<<endl;
  transform(all(vec1),vec2.begin(),vec1.begin(),[](int x,int y){return x*y;});
  cout<<3<<endl;
  for_each(all(vec1),[](int x){cout<<x<<" ";});cout<<endl;
  cout<<4<<endl;
}
10 10 10 10 10 10 10 10 10 10 
0
1
100 100 100 100 100 100 100 100 100 100 
2
3
1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 
4
[Finished in 0.4s]
#include<bits/stdc++.h>
using namespace std;
#define all(x) x.begin(),x.end()
#define pb push_back

template<typename T>
void out(T x){
  cout<<x<<" ";
}

int fun(int x,int y){
  return x*y;
}
bool mod2(int x){
  return x%2==0;
}

class Test{
public:
  bool operator()(int x) {
    return x%2==0;
  }
};

int main(){
  srand((unsigned)time(NULL));

  vector<int> vec;
  cout<<vec.capacity()<<endl;
  cout<<vec.max_size()<<endl;
  //1e9 is the max_size
  vec.reserve(100);
  cout<<vec.size()<<endl;
  //reserve doesn't make the size
  vec.resize(100);
  cout<<vec.size()<<endl;
  //resize will make the size

  vec.clear();
  cout<<vec.capacity()<<endl;
  cout<<vec.size()<<endl;

  vec.pb(1);
    vec.pb(3);
      vec.pb(2);
  for_each(all(vec),out<int>);
  cout<<endl;
  vector<int> vec2(vec);
  reverse(all(vec));
  for_each(all(vec),out<int>);
  cout<<endl;

  vec.clear();
  vec.resize(3);
  swap_ranges(all(vec2),vec.begin());//will be 
  
  for_each(all(vec),out<int>);
  cout<<endl;
  cout<<accumulate(all(vec),1,fun)<<endl;

  Test t;
  cout<<t.operator()(2)<<endl;

  generate(all(vec),rand);
  cout<<endl;
  for_each(all(vec),out<int>);
  cout<<endl;
  cout<<"numbers can divide 2 are "<<count_if(all(vec),mod2)<<endl;
}
#include <iostream>
#include <vector> 
using namespace std;
#define all(x) x.begin(),x.end()
#define pb push_back

template<typename T>
void out(T x){
  cout<<x<<" ";
}

int fun(int x,int y){
  return x*y;
}
bool mod2(int x){
  return x%2==0;
}

class Test{
public:
  bool operator()(int x) {
    return x%2==0;
  }
};

int main(){
  srand((unsigned)time(NULL));

  vector<int> vec;
  cout<<vec.capacity()<<endl;
  cout<<vec.max_size()<<endl;
  //1e9 is the max_size
  vec.reserve(100);
  cout<<vec.size()<<endl;
  //reserve doesn't make the size
  vec.resize(100);
  cout<<vec.size()<<endl;
  //resize will make the size

  vec.clear();
  cout<<vec.capacity()<<endl;
  cout<<vec.size()<<endl;

  vec.pb(1);
    vec.pb(3);
      vec.pb(2);
  for_each(all(vec),out<int>);
  cout<<endl;
  vector<int> vec2(vec);
  reverse(all(vec));
  for_each(all(vec),out<int>);
  cout<<endl;

  vec.clear();
  vec.resize(3);
  swap_ranges(all(vec2),vec.begin());//will be 
  
  for_each(all(vec),out<int>);
  cout<<endl;
  cout<<accumulate(all(vec),1,fun)<<endl;

  Test t;
  cout<<t.operator()(2)<<endl;

  generate(all(vec),rand);
  cout<<endl;
  for_each(all(vec),out<int>);
  cout<<endl;
  cout<<"numbers can divide 2 are "<<count_if(all(vec),mod2)<<endl;
}
上一篇下一篇

猜你喜欢

热点阅读