C++primer练习10.26-10.37

练习10.26

解释三种迭代器的不同之处

::back_inserter创建一个调用push_back的迭代器,不会打乱原有元素的顺序,inserter创建一个调用insert的迭代器,不会打乱插入位置之前包括插入位置的元素的顺序,

front_inserter创建一个调用push_front的迭代器,会把元素插入到当前位置之前,等于是取代了原有位置的元素,并让其及其后面都后移;对容器调用这些特殊迭代器必须符合其

本身支持的情况

练习10.27

除了unique之外,标准库还定义了名为unique_copy的函数,它接受第三个迭代器,表示拷贝不重复元素的目的位置。编写一个程序,使用unique_copy将一个vector中不重复的元素拷贝到一个初始为空的list中

#include<list>
int main()
{
    vector<int> a{1,2,3,4,5,6,6};
    list<int> b;
    unique_copy(a.begin(),a.end(),back_inserter(b));
    for(auto d:b)
    cout<<d<<endl;
 } 

练习10.28

一个vector中保存1到9,将其拷贝到三个其它容器中,分别使用inserter、back_inserter和front_inserter将元素添加到三个容器中。对每种inserter,估计输出序列是怎样的,运行程序验证你的估计是否正确

::inserter和back_inserter是1到9,front_inserter是9到1

#include<list>
int main()
{
    vector<int> a{1,2,3,4,5,6,7,8,9};
    list<int> b,c,d;
    copy(a.begin(),a.end(),front_inserter(b));
    copy(a.begin(),a.end(),inserter(c,c.end()));
    copy(a.begin(),a.end(),back_inserter(d));
    for(auto e:b)
    cout<<e<<endl;
    for(auto e:c)
    cout<<e<<endl;
    for(auto e:d)
    cout<<e<<endl;
 } 

练习10.29

编写程序,使用流迭代器读取一个文本文件,存入一个vector中的string里

int main()
{
    ifstream fin("word.txt");

    istream_iterator<string> filet(fin);
    vector<string> a;
    a.push_back(*filet);
    for(auto d:a)
    cout<<d<<endl;
 } 

练习10.30

使用流迭代器、sort和copy从标准输入读取一个整数序列,将其排序,并将结果写到标准输出

int main()
{
    
    istream_iterator<int> in(cin),eof;
    ostream_iterator<int> ot(cout,"wa");
    vector<int> a(in,eof);
    sort(a.begin(),a.end());
    copy(a.begin(),a.end(),ot);
    cout<<endl;
 } 

练习10.31

修改前一题的程序,使其只打印不重复的元素。你的程序应使用unique_copy

int main()
{
    
    istream_iterator<int> in(cin),eof;
    ostream_iterator<int> ot(cout,"wa");
    vector<int> a(in,eof);
    sort(a.begin(),a.end());
    unique_copy(a.begin(),a.end(),ot);
    cout<<endl;
 } 

练习10.32

重写书店程序,使用一个vector保存交易记录,使用不同算法完成处理。使用sort和compareisbn函数来排序交易记录,然后使用find和accumulate求和

int main()
{
    
    istream_iterator<Sales_item> in(cin),eof;
    vector<Sales_item> a(in,eof);
    sort(a.begin(),a.end(),compareIsbn);
        Sales_item sum;
    for(auto d=a.begin();d!=a.end();++d)
    {
        auto wc=find(d,a.end,d.isbn)
        if(wc==a.end())
        {
        cout << sum->isbn() << "  " << sum->sale() << endl;
        sum=*d;
             }
            else
            {
                sum+=accumulate(d,d+2,0);
                
                }    

    }
 } 

练习10.33

编写程序,接受三个参数:一个输入文件和两个输出文件的文件名。输入文件保存的应该是整数。使用istream_iterator读取输入文件。使用ostream_iterator将奇数写入第一个输出文件

,每个值后面跟一空格。将偶数写入第二个输出文件,每个值都独占一行。

void classical(ifstream& infile,ofstream& outfile1, ofstream& outfile2)
{
    istream_iterator<int> in(infile),eof;
    ostream_iterator<int> ot1(outfile1),ot2(outfile2);
    vector<int> a(in,eof);
    copy_if(a.begin(),a.end(),ot1,[](int i){return i%2!=0;    });
    copy_if(a.begin(),a.end(),ot2,[](int i){return i%2==0;    });
    

}

int main()
{
     ifstream infile("number.txt");
 ofstream outfile1("file1.txt");
 ofstream outfile2("file2.txt");
 classical(infile, outfile1, outfile2);
}

练习10.34

使用reverse——iterator逆序打印一个vector

int main()
{

    vector<int> a{1,2,3,4,5,6,7,8,9};
    ostream_iterator<int> ot(cout);
    copy(a.rbegin(),a.rend(),ot);
    cout<<endl;


 } 

练习10.35

使用普通迭代器逆序打印一个vector

int main()
{

    vector<int> a{1,2,3,4,5,6,7,8,9};
    ostream_iterator<int> ot(cout);
    auto d=--a.end();
    for(;d!=a.rend().base();--d)
    cout<<*d;
    cout<<*d<<endl;


 } 

练习10.36

使用find在一个int的list中查找最后一个值为0的元素

int main()
{

    list<int> a{1,2,3,4,5,6,7,1,9};
    ostream_iterator<int> ot(cout);
    auto d=find(a.rbegin(),a.rend(),1);

    


 } 

练习10.37

给定一个包含10个元素的vector,将位置3到7之间的元素按逆序拷贝到一个list中

int main()
{

    vector<int> a{1,2,3,4,5,6,7,1,9,10};
    list<int> b;
    copy(a.rend()+3,a.rend()-2,b.begin());
    

 } 

 

posted @ 2022-07-23 16:40  yddl  阅读(54)  评论(0)    收藏  举报