10.4 再探迭代器-插入/IO/反向

10.4.1 插入迭代器

插入迭代器接受一个容器,生成一个迭代器,通过向该迭代器赋值可以实现向容器添加元素 
(1)back_inserter: 
接受一个参数, 
示例: 
auto iter = back_inserter(iVec); 
iter = value; 
(2)front_inserter: 
接受一个参数, 
示例: 
auto iter = front_inserter(iVec); 
iter = value; 
(3)inserter: 
接受两个参数,示例:auto iter = inserter(iVec, it); //it必须是一个指向iVec的迭代器, 
iter = value; //将value插入到it之前

习题 10.28 三种插入迭代器的应用

int main()
{
    int array[] = { 1,2,3,4,5,6 };
    vector<int> iVec(begin(array), end(array));
    vector<int> iVec_back;
    deque<int> iDeque_front;
    list<int> iList_inserter;

    copy(iVec.begin(), iVec.end(), back_inserter(iVec_back));
    copy(iVec.begin(), iVec.end(), front_inserter(iDeque_front));
    copy(iVec.begin(), iVec.end(), inserter(iList_inserter, iList_inserter.begin()));

    system("pause");
}
View Code

习题10.27

int main()
{
    int array[] = { -2, 6, 1, 6, 5, -9, 4, -2, 8 };
    vector<int> iVec(begin(array), end(array));
    vector<int> iVecUnique;
    //元素排序,为拷贝不重复的元素做准备
    stable_sort(iVec.begin(), iVec.end());
    //拷贝不重复的元素到iVecUnique
    unique_copy(iVec.begin(), iVec.end(), back_inserter(iVecUnique));

    system("pause");
}
View Code

10.4.2 iostream迭代器

主要目的是使用算法操作流迭代器。

习题10.30 标准流迭代器的应用

int main()
{
    istream_iterator<int> in_ite(cin);  //定义输入流迭代器,并绑定标准输入流
    istream_iterator<int> in_end;   //定义尾后迭代器,没有数据读入时迭代器就为尾后迭代器
    ostream_iterator<int> out_iter(cout);   //定义输出流迭代器,并绑定标准输出流
    vector<int> iVec;
    copy(in_ite, in_end, back_inserter(iVec));
    sort(iVec.begin(), iVec.end());//排序
    copy(iVec.begin(), iVec.end(), out_iter);//输出到与 out_iter 绑定的标准输出设备
    system("pause");
}
View Code

习题 10.29 使用流迭代器读取文件

int main()
{       
    ifstream ifstrm("h:\\1.txt");   //定义文件输入流
    istream_iterator<string> in_iter(ifstrm);   //定义IO类的输入迭代器,并绑定ifstrm
    istream_iterator<string> in_end;    //定义尾后迭代器,没有数据读入时迭代器就为尾后迭代器
    vector<string> strVec;
    copy(in_iter, in_end, back_inserter(strVec));   //利用copy算法将文件中的内容放到容器,以单词为组

    system("pause");
}
View Code

10.4.3反向迭代器

//假定有一个名为 line 的string,保存着一个逗号分隔的单词列表,我们希望打印line中的第一个单词和最后一个单词,则分别用正向迭代器和逆向迭代器
int main()
{       
    string line = "first,middle,last";
    auto comma = find(line.cbegin(), line.cend(), ','); //查找第一个逗号
    cout << string(line.cbegin(), comma) << endl;

    //打印最后一个单词
    auto rcomma = find(line.crbegin(), line.crend(), ',');  //查找最后一个逗号
    cout << string(line.crbegin(), rcomma) << endl; //错误,输出 tsal 是逆序的
    //cout << string(rcomma, line.crbegin()) << endl;   //错误,rcomma是一个逆向迭代器,而line.crbegin()返回尾后字符,所以会溢出
    cout << string(rcomma.base(), line.end()) << endl;  //正确,反向迭代器调用base()函数会返回普通迭代器,注意调用后指向不同的元素,会移动一位
    system("pause");
}
View Code

猜你喜欢

转载自www.cnblogs.com/liyubo/p/7868754.html
今日推荐