STL之函数对象事例

来源:互联网 发布:国外二维码扫描软件 编辑:程序博客网 时间:2024/04/30 02:16

/*
 for_each()、transform、bind1st()函数的使用。
 知识点:
 如果STL函数需要一个一元函数,而现有一个能完成相应工作的自适应二元函数,则
 可以使用bind1st()或bind2nd使该二元函数适用于一元接口。

 程序输出:
 gr8:    36 39 42 45 48
 m8:     25 27 29 31 33
 sum:    61 66 71 76 81
 prod:   90 97.5 105 112.5 120
 */
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>

using namespace std;

void Show(double);
const int LIM = 5;

int main()
{
 double arr1[LIM] = {36, 39, 42, 45, 48};
 double arr2[LIM] = {25, 27, 29, 31, 33};
 vector<double> gr8(arr1, arr1 + LIM);
 vector<double> m8(arr2, arr2 + LIM);

 cout << "gr8: \t";
 for_each(gr8.begin(), gr8.end(), Show);
 cout << endl;

 cout << "m8: \t";
 for_each(m8.begin(), m8.end(), Show);
 cout << endl;

 vector<double> sum(LIM);
 transform(gr8.begin(), gr8.end(), m8.begin(), sum.begin(), plus<double>());
 cout << "sum: \t";
 for_each(sum.begin(), sum.end(), Show);
 cout << endl;

 vector<double> prod(LIM);
 transform(gr8.begin(), gr8.end(), prod.begin(), bind1st(multiplies<double>(), 2.5));
 cout << "prod: \t";
 
 for_each(prod.begin(), prod.end(), Show);
 cout << endl;

 getchar();
 return 0;
}

void Show(double d)
{
 cout << d << ' ';
}

 

/*
 程序输出:
 Enter words (enter quit to quit):
 LIU
 YAN
 MIN
 liu
 quit
 You entered the following words:
 LIU YAN MIN liu

 Alphabetic list of words:
 liu min yan

 Word frequency :
 liu: 2
 min: 1
 yan: 1
 */
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <iterator>
#include <algorithm>
#include <cctype>

using namespace std;

char toLower(char ch)
{
 return tolower(ch);
}
string &ToLower(string &st);
void display(const string &s);

int main()
{
 vector<string> words;
 cout << "Enter words (enter quit to quit): \n";
 string input;
 while(cin >> input && input != "quit")
  words.push_back(input);

 cout << "You entered the following words: \n";
 for_each(words.begin(), words.end(), display);
 cout << endl;

 //place words in set, converting to lowercase
 set<string> wordset;
 transform(words.begin(), words.end(), insert_iterator<set<string>> (wordset, wordset.begin()), ToLower);
 cout << "\nAlphabetic list of words: \n";
 for_each(wordset.begin(), wordset.end(), display);
 cout << endl;

 //place word and frequency in map
 map<string, int > wordmap;
 set<string>::iterator si;
 for (si = wordset.begin(); si != wordset.end(); si++)
  wordmap[*si] = count (words.begin(), words.end(), *si);

 //display map contents
 cout << "\nWord frequency :\n";
 for (si = wordset.begin(); si != wordset.end(); si++)
 {
  cout << *si << ": " << wordmap[*si] << endl;
 }

 getchar();
 getchar();
 return 0;
}

string &ToLower(string &st)
{
 transform(st.begin(), st.end(), st.begin(), toLower);
 return st;
}

void display(const string & s)
{
 cout << s << ' ';
}

 

 

原创粉丝点击