C++primer学习:再探迭代器

插入迭代器:

(1)back_inserter,创建一个使用push_back()的迭代器.
(2)front_inserter,创建一个使用push_front()的迭代器.
(3)inserter创建一个使用insert的迭代器.此函数接受第二个参数,一个指向给定容器的迭代器.元素将被插入到给定迭代器所表示的元素之前.
注意,容器必须支持相应操作才能够用相应的插入迭代器;
.

练习:用unique_copy将一个vector中不重复的元素拷贝到一个空的list中//unique_copy是标准库提供的算法.

vector<int> vec{ 1, 2,2,3, 3, 4, 5, 6, 7, 8, 9 };
    list<int> lst;
    unique_copy(vec.cbegin(), vec.cend(), inserter(lst,lst.begin()));

练习:将一个vector容器的数据拷贝到其它三个容器,分别用三个不同的插入迭代器.

    vector<int> vec{ 1, 2,2,3, 3, 4, 5, 6, 7, 8, 9 },vec1,vec2;
    list<int>lst;
    copy(vec.cbegin(), vec.cend(),back_inserter(vec1));
    print(vec1);
    copy(vec.cbegin(), vec.cend(), inserter(vec2, vec2.begin()));
    print(vec2);
    copy(vec.cbegin(), vec.cend(), front_inserter(lst));
    print(lst);

这里写图片描述

======================================================================================

流迭代器:

istream_iterator,ostream_iterator;流迭代器必须指定要读写的类型;

istream_iterator<string> in(cin);
istream_iterator<string> eof//尾后迭代器
ostream_iterator<string> out(cout);
ostream_iterator<string> out(os,d)//d是一个字符串,每次输出都会有d;
vector<string> vec(in,eof)//直接通过迭代器来构造vec.不需要编写循环

练习:用六迭代器文件读取内容保存到一个vector的string中.

ifstream in("Text.txt");//in绑定到Text;
    istream_iterator<string>  str_in(in);//迭代器str_in 绑定到流ifstream上
    istream_iterator<string> eof;
    S ves;
    copy(str_in, eof, back_inserter(ves));
    copy(ves.cbegin(), ves.cend(),ostream_iterator<string>(cout, "\n"));
    return 0;

练习:使用迭代器从标准输入中读入数据,排序后写入标准输出.

    istream_iterator<int> in(cin);
    istream_iterator<int> eof;
    vector<int> vec;
    copy(in, eof, back_inserter(vec));
    sort(vec.begin(), vec.end());
    copy(vec.cbegin(),vec.cend(),ostream_iterator<int> (cout, " "));
    return 0;

练习:通过流迭代器,accumulate,sort等算法重写书店程序,将相同isbn()码的纪录求和并输出结果.

int main()
{
    istream_iterator<Sales_item> in(cin),eof;//输入数据
    vector<Sales_item> vec(in, eof);
    sort(vec.begin(), vec.end(), [](const Sales_item&s1,
    const Sales_item&s2){return s1.isbn() < s2.isbn(); });//排序
    Sales_item sum;
    for (auto start = vec.begin(), newend = vec.end(); start != vec.end(); start = newend)
    {
        newend = find_if(start, vec.end(),
        [start](const Sales_item & it){ return it.isbn()!=start->isbn();});//获取第一个不等的
        cout<<start->isbn()<<" : "<< accumulate(start, newend,Sales_item())<<endl;
    }
    return 0;
}

练习:编写一个函数,读入三个文件名,从第一个读取数据,把奇数写入第一个文件,每个之间用空格隔开.偶数写入第二根文件,用换行隔开.

void func(const string& in_name, const string& odd_name,const string& even_name)
{
ifstream is_file(in_name);
ofstream os1(odd_name), os2(even_name);
istream_iterator<int> is(is_file), eof;
ostream_iterator<int> out1(os1, " "), out2(os2, "\n");
vector<int> vec;
copy(is, eof, back_inserter(vec));
for (auto element : vec)
(element % 2 ? out1 : out2) = element;
//另外一种写入方法
//for_each(is, eof, [&out1, &out2](const int i)
//{ ((i % 2) ? out1 : out2) = i; });
}

======================================================================================

反向迭代器:除了forward_list之外,其它容器都支持反向迭代器.++it,会移动到前一个元素.rebegin,rend,crbegin,crend;

sort(vec.rbegin(),vec.rend());//反向排序

练习:找到最后一个为0的元素.

vector<int>vec{ 1, 2,0, 3, 4, 5, 6, 7,0, 8, 9 };
    auto it = find(vec.rbegin(), vec.rend(), 0);
    cout << *it << endl;

把vector位置3到7之间的元素逆序拷贝.

    vector<int>vec{ 1, 2,0, 3, 4, 5, 6, 7,0, 8, 9 };
    list<int> lst(vec.rbegin()+3,vec.rend()-3);

你可能感兴趣的:(C++primer学习:再探迭代器)