2-1:
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
string intro1 = "my name is andyque";
string intro2 = "my age is 22";
cout<<intro1<<endl;
cout<<intro2<<endl;
string shoe = "shoes";
string band = "LiNing";
intro1.replace(11,band.length(),band);
intro1.replace(intro1.begin() + 3,intro1.begin()+7,"shoes");
copy(intro1.begin(),intro1.end()-1,ostream_iterator<char>(cout,"")); //这个地方减1,因为替换的子串比原串长,导致残留一个"e"
cout<<endl;
intro2.insert(intro2.find_first_of(" ")," favorite dog's");
intro2.replace(intro2.find_first_of("0123456789"),1,"3");
intro2.erase(intro2.size()-1,1);
cout<<intro2<<endl;
return 0;
}
2-2:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <functional>
using namespace std;
//原题太简单,我稍微扩展一下,从键盘输入半径,直到文件尾 ctrl+z,输出所有的圆的面积
int main()
{
const double PI = 3.141592654;
vector<int> radiusVec;
copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(radiusVec));
copy(radiusVec.begin(),radiusVec.end(),ostream_iterator<int>(cout," "));
cout<<endl;
cout<<setfill('-')<<setw(30)<<" "<<setfill(' ');
cout<<endl;
transform(radiusVec.begin(),radiusVec.end(),radiusVec.begin(),radiusVec.begin(),multiplies<int>());
vector<double> areaVec;
transform(radiusVec.begin(),radiusVec.end(),back_inserter(areaVec),bind2nd(multiplies<double>(),PI));//此处的multiplies模板参数必需是double型
copy(areaVec.begin(),areaVec.end(),ostream_iterator<double>(cout," "));
cout<<endl;
return 0;
}
2-3:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <functional>
#include <fstream>
using namespace std;
bool doomy(string str)
{
return true;
}
int main()
{
ifstream infile;
string filename;
cout<<"please enter the filename you want to open: /n";
cin>>filename;
infile.open(filename.c_str(),ios::in); //确保文件名所在文件在当前目录下,或者输入的文件名本身带路径
vector<string> wordsVec;
if(infile)
{
//方法一:
// copy(istream_iterator<string>(infile),istream_iterator<string>(),back_inserter(wordsVec));
// cout<<wordsVec.size()<<endl;
//方法二:
cout<< count_if( istream_iterator<string>(infile),istream_iterator<string>(),doomy) << endl; //因为infile默认是按空格读取的,直接统计实际字符串个数即可
infile.close();
}
else
{
cout<<"you input a wrong filename,the app exit!"<<endl;
}
return 0;
}
2-4:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <functional>
#include <fstream>
using namespace std;
int main()
{
ifstream infile;
string filename;
cout<<"please enter the filename you want to open: /n";
cin>>filename;
infile.open(filename.c_str(),ios::in); //确保文件名所在文件在当前目录下,或者输入的文件名本身带路径
vector<string> wordsVec;
if(infile)
{
cout<<"please input what word do you want to check: "<<endl;
string key;
cin>>key;
//method 1:
cout<<count(istream_iterator<string>(infile),istream_iterator<string>(),key)<<endl;
//method 2:
//cout<< count_if( istream_iterator<string>(infile),istream_iterator<string>(),bind2nd(equal_to<string>(),key) ) << endl;
infile.close();
}
else
{
cout<<"you input a wrong filename,the app exit!"<<endl;
}
return 0;
}
2-5:
class foo : public unary_function<string,string>
{
private:
int lineno;
public:
foo(int num) : lineno(num)
{
}
string operator()(string str)
{
char* line = new char[lineno+1];
sprintf(line,"%d",lineno);
string tmp = string(line) +":" + str;
--lineno; delete line;
return tmp;
}
};
int main()
{
ifstream infile("2-1.cpp");
vector<string> strVec;
string line;
while(getline(infile,line))
{
strVec.push_back(line);
}
//method 1:
//reverse_copy(strVec.begin(),strVec.end(),ostream_iterator<string>(cout,"/n"));
//method2: //每行前面加上行号
//copy(strVec.rbegin(),strVec.rend(),ostream_iterator<string>(cout,"/n"));
foo f1(strVec.size());
transform(strVec.rbegin(),strVec.rend(),ostream_iterator<string>(cout,"/n"),f1);
return 0;
}
2-6:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <functional>
#include <fstream>
#include <cstdlib>
using namespace std;
class foo
{
private:
string result;
public:
void operator()(string str)
{
result += str;
}
operator string()
{
return result;
}
};
int main()
{
ifstream infile("2-1.cpp");
vector<string> strVec;
copy(istream_iterator<string>(infile),istream_iterator<string>(),back_inserter(strVec));
string result = for_each(strVec.begin(),strVec.end(),foo());
cout<<result<<endl;
return 0;
}
2-7: (注:此程序在vs2005下面有问题,当连续按下几个回车后,程序崩了,但是进程仍在,同样的程序在DEV-C++下面一点问题也没有,猜想可能是PJ STL实现有问题,还是开源好啊,STLPORT真好!!!)
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <functional>
#include <fstream>
#include <cstdlib>
using namespace std;
void foo(string str)
{
cout<<str<<endl;
char c;
do
{
cout<<"请输入回车显示下一行:"<<endl;
c = cin.get();
if (c != '/n') //忽略按其他字符时键入的回车键
{
cin.ignore(1);
}
} while (c != '/n');
}
int main()
{
ifstream infile("2-1.cpp");
string line;
vector<string> strVect;
while(getline(infile,line))
{
strVect.push_back(line);
}
for_each(strVect.begin(),strVect.end(),foo);
return 0;
}
2-8:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <functional>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
const float factor = 0.8827f;
class foo
{
public:
foo()
{
srand((unsigned int)(time(NULL)));
}
float operator()()
{
return rand()*factor;
}
};
int main()
{
vector<float> fltVec;
generate_n(back_inserter(fltVec),25,foo());
copy(fltVec.begin(),fltVec.end(),ostream_iterator<float>(cout," "));
cout<<endl;
return 0;
}
2-9:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <functional>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
const float factor = 0.8827f;
class foo
{
public:
foo()
{
srand((unsigned int)(time(NULL)));
}
float operator()()
{
return rand()*factor;
}
};
int main()
{
vector<float> fltVec1;
vector<float> fltVec2;
vector<float> fltVec3;
generate_n(back_inserter(fltVec1),25,foo());
copy(fltVec1.begin(),fltVec1.end(),ostream_iterator<float>(cout," "));
cout<<endl;
generate_n(back_inserter(fltVec2),25,foo());
copy(fltVec2.begin(),fltVec2.end(),ostream_iterator<float>(cout," "));
cout<<endl;
transform(fltVec1.begin(),fltVec1.end(),fltVec2.begin(),back_inserter(fltVec3),multiplies<float>());
copy(fltVec3.begin(),fltVec3.end(),ostream_iterator<float>(cout," "));
cout<<endl;
return 0;
}
2-10:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <functional>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
const float factor = 0.8827f;
class foo
{
public:
foo()
{
srand((unsigned int)(time(NULL)));
}
float operator()()
{
return rand()*factor;
}
};
int main()
{
vector<float> fltVec;
generate_n(back_inserter(fltVec),25,foo());
copy(fltVec.begin(),fltVec.end(),ostream_iterator<float>(cout," "));
cout<<endl;
transform(fltVec.begin(),fltVec.end(),fltVec.begin(),fltVec.begin(),multiplies<float>());
copy(fltVec.begin(),fltVec.end(),ostream_iterator<float>(cout," "));
cout<<endl;
return 0;
}