C++primer_泛型算法-插入迭代器和iostream迭代器

  • 三種插入迭代器的區別?
    • 插入迭代器本質上是一種適配器迭代器,標準庫爲了保證通用性,並不直接操作容器,而是通過迭代器間接操作容器,因此,算法不具備直接向容器插入元素的能力,而插入器正是幫助算法實現向容器內插入元素的機制。
    • 除了 back_inserter,標準庫還提供了front_inserter和inserter,三者的差異主要在如何向容器內插入元素back_inserter是通過用push_back。front_inserter是調用push_front,而inserter調用insert。
    • 這三種調用方式也決定了元素位置插入的不同,分別是back尾後插入front首前插入,而inserter則是插入到給定位置,因此inserter在插入操作的時候傳入兩個參數。記住只有在容器支持的情況下,算法操作纔可以被執行 。

以下是簡單的三種插入迭代器的應用,加上一點算法基礎主要包含了C++primer第十章泛型算法第四節插入迭代器和iostream迭代器的操作。其中個別註釋代表着這段代碼,有點特殊。簡單代碼習題包含着10.22-10.31。對於10.33.我重新寫出來吧

#include <iostream>
#include <vector>
#include<list>
#include<string>
#include<numeric>
#include<algorithm>
#include <fstream>
using namespace std;
int main(int argc, char ** argv)
{

    vector<int >vi = {1,78,2,34,5,5,6,5,6};
    list<int >li;
    unique_copy(vi.begin(), vi.end(), back_inserter(li));
    for (auto v:li)
    {
        cout << v << " ";
    }
    cout << endl;
    list<int >frontli;
    unique_copy(vi.begin(), vi.end(), front_inserter(frontli));

    for (auto v : frontli)
    {
        cout << v << " ";
    }
    cout << endl;
    list<int >insertli;
    unique_copy(vi.begin(), vi.end(), inserter(insertli,insertli.begin()));
    unique_copy(vi.begin(), vi.end(), inserter(insertli, (++insertli.begin())));
    for (auto v : insertli)
    {
        cout << v << " ";
    }
    cout << endl;
    //////////////////////////////////////////////////////////////////////////
    ifstream in("xujjian.txt");//打開文件並讀取
    if (!in)
    {
        cout << "代開文件失敗" << endl;
        exit(1);
    }
    istream_iterator<int> in_iter(in);//綁定流這裏可以是文件流也可以是輸入流cin
    istream_iterator<int> eof;//這個eof必須顯式的定義出來,以便於系統識別文件的末尾
    vector<int>words;
    while (in_iter!=eof)
    {
        words.push_back(*in_iter++);
    }
    for (auto v : words)//auto C++11的新特性,遍歷 auto x:v
        cout << v<<" ";
    cout << endl;
    ////////////10.31///////////////////////////////////////////
    istream_iterator <int>cin_iter(cin);
    vector<int>viint;
    while (cin_iter != eof)
    {
        viint.push_back(*cin_iter++);
    }
    sort(viint.begin(),viint.end());
    ostream_iterator <int>out_iter(cout," ");
    unique_copy(viint.begin(),viint.end(),out_iter);
    system("pause");

}

下面是10.33的主要代碼。其中包含了文件迭代器的簡單應用。

//////////////////////////////////////////////////////////////////////////
//本文件主要體現了iostream迭代器的應用
#include<iostream>
#include<vector>
#include <istream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
#include <numeric>
using namespace std;
int main(int argc, char ** argv)
{
    //在這裏利用argc和argv數組可以記錄輸入的文件名從而對文件進行操作,在這個例子爲了讓代碼更加清晰可見在這裏使用直接對文件操作,而不再輸入的情況下進行操作,文件名直接默認。
    ifstream  openedfile("xujjian.txt");
    ofstream outfile1("xujian1.txt");//文件默認模式是不存在則新建此文件,不存在的話你會發現在項目目錄下存在了此文件
    ofstream outfile2("xujian2.txt");
    if (!openedfile)
    {
        cout << "打開數據文件失敗" << endl;
        exit(1);
    }
    if (!outfile1)//在這裏存在一個文件誤區就是如果文件不存在,則打開失敗,需要傳入參數,保證如果定向輸出文件失敗的話,可以新建此文件
    {
        cout << "打定向輸出文件1失敗" << endl;

    }
    if (!outfile2)
    {
        cout << "打開定向輸出文件2失敗" << endl;

    }
    istream_iterator<int>eof, in_iter(openedfile);
    ostream_iterator<int>out_iter1(outfile1," ");
    ostream_iterator<int>out_iter2(outfile2, "\n ");//第二個參數保證沒輸出一個數據後面的分隔符
    while (in_iter != eof)//保證將這個文件的偶數分割開來
    {
        if (*in_iter & 1)
        {
            *out_iter1++ = *in_iter;
        }
        else
            *out_iter2++ = *in_iter;
        in_iter++;
    }
    system("pause");

}
  • 在這裏有一點就是程序運行結束後必須按回車讓程序運行結束,到此文件保存,生成可讀取文件,不能異常退出,要不然文本文件不能被保存。可以在這段程序中添加兩個vector容器然後將文本文件內容放到容器裏面,這樣可以驗證文件是否被寫入數據。
    到此結束。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章