插入 流和反向迭代器

2022-07-22 06:09:09 字數 3113 閱讀 7812

目錄流迭代器

反向迭代器

用於向容器插入元素,一共有三種,back_inserter,front_insert和inserter;

back_inserter需要容器支援push_back,功能就是建立乙個使用push_back的迭代器,元素插入到之後

front_inserter需要容器支援front_back,功能建立乙個能使用push_front的迭代器,元素會被插入到容器首部

inserter接受兩個引數,建立乙個使用insert的迭代器,元素會被插入到給定迭代器的元素之前

#includeusing namespace std;

void print(listv) );

cout << endl;

}int main(void) ;

listv1, v2, v3, v4;

v3 = v4 = v1;

unique_copy(vec.cbegin(), vec.cend(), inserter(v1, v1.begin()));

unique_copy(vec.cbegin(), vec.cend(), back_inserter(v3));

unique_copy(vec.cbegin(), vec.cend(), front_inserter(v4));

unique_copy(vec.cbegin(), vec.cend(), back_inserter(v2));

print(v1);

print(v3);

print(v4);

print(v2);

return 0;

}

上面的**結果如下:

1 2 3 666 777

666 777 1 2 3

3 2 1 666 777

1 2 3

將vec中的元素分別用三種插入迭代器進行不重複複製的時候就可以看到三種迭代器的不同之處,即插入位置的不同。

istream_iterator讀取輸入流,而ostream_iterator向乙個輸出流寫入資料。

用流迭代器時,必須指定迭代器將要讀寫的元素型別,同時要求所讀寫的元素必須支援對應的運算子,istream_iterarot要求》,另乙個要求<

istream_iteratorin(ins); //in從輸入流ins中讀取型別為t的值

istream_iteratoreof; //istream_iteratoreof();時,此時的eof就相當於指向eof標誌的迭代器,名字任意

ostream_iteratorout(oos);//out將型別為t的值寫入到輸出流oos中

ostream_iteratorout(oos,str);//在寫入資料到輸出流的基礎上,在每個值的後面都加上乙個字串str,str只能是乙個c風格的字串

結合檔案操作,如下**:

#includeusing namespace std;

int main(void)

for (auto i : s1)

*put++ = i;//將s1中的元素通過put輸出到檔案中

out << endl;//重新整理緩衝區

in = fin;//將迭代器重新繫結到檔案輸入流中

while (in != eof)

for (auto i : s2)cout << i << " "; cout << endl;//列印s2中的元素

return 0;

}

上述**即從標準輸入流中讀入資料到s1中,然後將s1中的資料輸出到檔案裡,再從檔案裡讀取資料到s2,在輸出到螢幕上。雖然沒什麼用,卻還是能體現出流迭代器的作用,但是仍然比較繁瑣,和標準庫演算法結合起來,迭代器才更加強大。

#includeusing namespace std;

int main(void)

這樣來迴圈都不用寫了,用copy就能完成輸出,上面的輸出流也能重新繫結,

反向迭代器是在容器中從尾部元素向首部元素反向移動的迭代器。同時遞加和遞減操作會顛倒,遞增為向前乙個元素移動,即向首部移動;遞減為向後乙個移動,即向尾部移動。

除了forward_list之外其他容器都支援反向迭代器。

反向迭代器有rbegin,rend,crbegin和crend;

四種迭代器指向的容器位置如下所示:

逆序列印vector

vectorvt;

copy(vt.crbegin(), vt.crend(), ostream_iterator(cout," "));

輸出為

cc bb aa
同樣如果只有乙個string,就會反向列印這個string的字元,因為反向迭代器會反向操作容器中的元素

cout << string(str.crbegin(), str.crend()) << endl;

輸出為

rennid,elppa
反向迭代器可以用自帶的base成員函式來轉換為乙個普通正向迭代器;

cout << string(str.crend().base(), str.crbegin().base()) << endl;

輸出為轉換後的迭代器和原來的迭代器表示的範圍是一樣的,即

[crbegin(),crend())和[crend().base(), crbegin().base())
這兩者的元素範圍相同,但是轉換前後的迭代器指向的不是同乙個元素。具體表示如下圖

迭代器 反向迭代器

c primer 中文版第四版 第273頁 9.3.2 begin和end成員 begin和end操作產生指向容器內第乙個元素和最後乙個元素的下乙個位置的迭代器,如下所示。這兩個迭代器通常用於標記包含容器中所有元素的迭代範圍。c.begin 返回乙個迭代器,它指向容器c的第乙個元素 c.end 返回...

迭代器和反向迭代器,常量迭代器和非常量迭代器

迭代器的型別共有4種 iiterator,const iterator,reverse iterator,const reverse iterator include include include include using namespace std int main include inclu...

Python 反向迭代和實現反向迭代

案例 實現乙個連續的浮點數發生器,floatrange,根據給定範圍 start,end 和步進值,產生一些列的浮點數,例如 floatrange 3,4,0.2 將產生下列序列 正向 3.0 3.2 4.0 反向 4.0 3.8 3.0 如何實現?方法1 列表翻轉 usr bin python3 ...