Thinking in c++ 2nd 习题解答之STL实现(一)

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值