C++ 標準庫 書籍學習記錄筆記 第5章

5.3 迭代器?

  • 前置式遞增比后置式遞增效率更高,因為后者需要一個額外的臨時對象,因為他需要存儲一個迭代器原本的位置并將其進行返還,因此最好使用++pos,而不是pos++;

5.3.1 關聯式容器的運用實例

  • 修改map默認的遞增的方式,將內部排序修改為 遞減方式
  • ? ? std::map<int,int,std::greater<int>>map{};
  • greater是一個預先定義的仿函數
  • 關聯式容器使用自己的默認規則進行元素位置的存放,因此相較于序列式容器取消了push_back()和push_front()函數
  • std::greater - C++中文 - API參考文檔
#include <list>
#include <iostream>
#include <set>
#include <map>int main(){std::map<int,int,std::greater<int>>map{};map.insert(std::make_pair(1,1));map.insert(std::make_pair(2,2));map.insert(std::make_pair(3,3));map.insert(std::make_pair(4,4));for (auto temp=map.begin();temp!=map.end();++temp) {std::cout << temp->first << " " << temp->second << std::endl;}
}
  • multimap包含在map頭文件內部,允許key和value是1對多的關系
#include <list>
#include <iostream>
#include <set>
#include <map>int main(){std::multimap<int,int,std::greater<int>>map{};map.insert(std::make_pair(1,1));map.insert(std::make_pair(1,1));map.insert(std::make_pair(1,1));map.insert(std::make_pair(1,1));map.insert(std::make_pair(2,2));map.insert(std::make_pair(3,3));map.insert(std::make_pair(4,4));for (auto temp=map.begin();temp!=map.end();++temp) {std::cout << temp->first << " " << temp->second << std::endl;}
}
  • 迭代器訪問 元素的時候,可以使用 迭代器->first? 或者? (*迭代器).first 使用*解除引用,再對元素進行訪問
  • 類名 變量名;將創建一個對象將其存儲在棧上,使用 變量名.成員? 進行使用
  • 類名 變量名 = new 類名();??將創建一個對象將其存儲在堆上,使用 變量名->成員? 進行使用
  • map 鍵值/實值 所形成的群集中,如果所有的鍵值是唯一的,將其作為一個關聯式數組;這里想表達的意思是我們可以像使用數組一樣進行元素的訪問,數組通過數組下標訪問對應的數值,map可以通過指定key,訪問對應的value。通過map[key]訪問對應的數值

5.3.2 迭代器分類

  • 雙向迭代器 Bidirectional iterator:雙向行進,采用遞增進行前進運算,使用遞減進行后退運算,list、set、multiset、map和undered_map 都使用這個迭代器
  • 隨機存儲迭代器Random access iterator:在雙向迭代器的基礎上還具備了隨機訪問的特性,因此可以對迭代器增加或者減少一個偏移量,處理迭代器之間的距離,或者使用<和>之類的relational相對關系的操作符來比較兩個迭代器。vector、deque和string均采用此迭代器
  • 盡量使用 != 這個的適配性更好,但是如果pos位于了end的后面,發生錯誤很難發現
    for(pos = coll.begin();pos != coll.end();++pos){}operator !=for(pos = coll.begin();pos < coll.end();++pos){}//operator < Random access iterator

5.4 算法

  • 算法不是容器類別的成員函數,而是搭配迭代器使用的全局函數,采用的是泛型函數編程的思維,數據和操作進行分離

5.4.2 處理多個區間

  • copy將第一區間的數據拷貝到目標區域,第一區間的起點和第一區間的終點確定了第一區間的元素的數量,因此第二區間只需要提供一個起點即可。
  • 但是copy函數使用的是覆寫操作,不是插入操作,因此需要第二區間具備足夠的內存空間,如下例子所示,會產生未定義的行為
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>int main(){std::list<int>coll1;std::vector<int>coll2;for (int i = 1; i <= 9; ++i) {coll1.push_back(i);}std::copy(coll1.begin(),coll1.end(),coll2.begin());
}
  • 對上述錯誤代碼的修改:1,確認目標區域具備足夠的內存;2,采用insert iterator
    std::list<int>coll1;std::vector<int>coll2;for (int i = 1; i <= 9; ++i) {coll1.push_back(i);}coll2.resize(coll1.size());std::copy(coll1.begin(),coll1.end(),coll2.begin());

5.5 迭代器配接器

  • Insert iterator 安插型迭代器
  • Stream iterator 流迭代器
  • reverse iterator 逆向迭代器

Insert iterator 安插型迭代器

  • 采用安插方式而不是覆寫的方式運作,解決目標區域不足的問題? 3種方式
  • Back inserters 安插在容器的最尾端:內部調用push_back() 采用追加的操作,只能適用于具備push_back()成員函數的容器中? 適用于vector list deque
  • ? ? std::copy(coll1.begin(),coll1.end(),std::back_inserter(coll2));
  • Front inserters 安插在容器最前端,內部調用的是push_front() ,這種操作會逆轉被插元素的次序,比如插入1 再次插入 2,輸出的時候2會在1 的前面打印輸出? 這個適用于 list 和 deque
  • ? ? std::copy(coll1.begin(),coll1.end(),std::insert_iterator<>(coll2));
  • General inserters一般性安插器: 將元素插入到初始化時接受的第二個參數指向的前方。內部調用的是insert函數,并按照新值和新的位置作為參數。適用于關聯式容器

?流迭代器

  • stream iterator是一種用來讀取stream流的迭代器。提供了必要的抽象性,使得鍵盤的輸入像一個群集,使得程序員可以從中讀取內容,也可以把算法的輸出重新導向某個文件或者屏幕
  • 代碼沒有跑通
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>using namespace std;
int main(){std::vector<std::string>coll{};copy(std::istream_iterator<string>(cin),istream_iterator<string>(),back_inserter(coll));sort(coll.begin(),coll.end());unique_copy(coll.begin(),coll.end(),ostream_iterator<string>(cout,"\n"));
}

5.5.3 reverse iterators 逆向迭代器

  • coll.rbegin()指向的是逆向遍歷的起點,也就是先前的end()-1 的位置?

5.6.1 移除元素

  • ?remove移除元素,是使用刪除元素位置之后的元素對刪除位置上的元素進行替代,不會是將其所有的3全部刪除
  • 但是群集末尾未被覆蓋的元素原封不動,但是從邏輯層面上講,他們已經不屬于這個群集了
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>using namespace std;
int main(){std::list<int>coll{};for(int i=1;i<=6;i++){coll.push_back(i);coll.push_front(i);}std::cout << "pre: ";copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));std::cout << std::endl;std::remove(coll.begin(),coll.end(),3);std::cout << "post: ";copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));std::cout << std::endl;
}
  • pre: 6 5 4 3 2 1 1 2 3 4 5 6
  • post: 6 5 4 2 1 1 2 4 5 6 5 6?
  • 實際上 算法會產生一個新的終點,需要更新新的終點的位置,獲得新的區間,也就是縮減元素之后的容器的大小,亦或是刪除元素的個數

?改進如下

  • ? ? std::list<int>::iterator end = std::remove(coll.begin(),coll.end(),3);
  • 這個end也就是經過刪除之后邏輯上新的終點
  • 或者獲取徐亞刪除的元素的個數,利用distance函數,返回兩個迭代器之間的距離
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>using namespace std;
int main(){std::list<int>coll{};for(int i=1;i<=6;i++){coll.push_back(i);coll.push_front(i);}std::cout << "pre: ";copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));std::cout << std::endl;std::list<int>::iterator end = std::remove(coll.begin(),coll.end(),3);std::cout << "post: ";copy(coll.begin(),end,ostream_iterator<int>(cout," "));std::cout << std::endl;std::cout << "number of removed elements: "<< std::distance(end,coll.end()) << std::endl;coll.erase(end,coll.end());copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));std::cout << std::endl;
}

5.6.2 更易型算法和關聯式容器

  • 更易型算法是指 移除、重排、修改元素的算法,這些算法不適用于關聯型算法,因為這些操作會修改位置上的數值,破壞排序
  • 因此,關聯式容器的所有迭代器都被聲明為指向常量
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>using namespace std;
int main(){set<int>coll{};for (int i = 0; i <= 9; ++i) {coll.insert(i);}copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));std::cout << std::endl;int num = coll.erase(3);cout << "number os removed elements:" << num << std::endl;copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
}

5.6.3 算法 VS 成員函數

  • 如果容器提供了功能相似但是性能更佳的成員函數,優先使用成員函數
  • 成員函數 對其進行了優化,相較于函數功能相似的算法

  • 成員函數?remove(coll.begin(),coll.end(),4)
  • 算法:? ? coll.remove(4);
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>using namespace std;
int main(){list<int>coll{};for (int i = 1; i <= 6; ++i) {coll.push_front(i);coll.push_back(i);}coll.erase(remove(coll.begin(),coll.end(),3),coll.end());coll.remove(4);
}

5.8.1 以函數作為算法的參數

  • 算法接收用戶定義的輔助性函數 ,在算法的內部被調用
  • for_each函數對coll的begin到end區間內的每一個元素都調用print函數進行輸出
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>using namespace std;void print(int elem){std::cout << elem << " ";
}
int main(){std::vector<int>coll{};for (int i = 1; i <= 9; ++i) {coll.push_back(i);}std::for_each(coll.begin(),coll.end(),print);
}
  • 算法以🌲種態度來面對輔助函數,1,將其視為可有可無;2,視為必要;
  • 利用他們指定搜尋的規則、排序的規則或者定義某種操作,從而將某個容器內 的元素轉換到另外一個容器
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>using namespace std;void print(int elem){std::cout << elem << " ";
}int square(int value){return value*value;
}
int main(){std::set<int>coll{};std::vector<int>coll2{};for (int i = 1; i <= 9; ++i) {coll.insert(i);}std::transform(coll.begin(),coll.end(),std::back_inserter(coll2),square);std::for_each(coll2.begin(),coll2.end(),print);
}

5.8.2 判斷式

  • 潘端師就是返還結果是布爾數值的函數,常用于指定排序準則和搜尋準則,可能有一個或者兩個操作數
  • 判斷式 對于相同的輸入返還相同的輸出結果,且程序執行不可以改變內部狀態?

一元判斷式

?二元判斷式

?

5.9 仿函數

  • 泛型編程強大威力和存粹抽象的一個例證。仿函數就是行為像函數,比如定義一個對象,他具備類似函數的一些特性,就可以當做函數來使用;比如使用小括號傳遞參數,如果指望定義的對象也可以實現 使用小括號傳遞參數,比如定義operator()???
#include <list>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>using namespace std;class X{
public:int operator()(int v1,int v2)const;
};
int X::operator()(int v1, int v2) const {std::cout << v1 << " "<< v2<< std::endl;
}
int main(){X fo;fo(4,5);fo.operator()(4,5);
}
class PrintInt{
public:void operator()(int elem)const{std::cout << elem << std::endl;}
};
int main(){std::vector<int>coll{};for (int i = 1; i <= 6; ++i) {coll.push_back(i);}std::for_each(coll.begin(),coll.end(),PrintInt());
}

?

void add10(int & elem){elem += 10;
}
int main(){std::vector<int>coll{};for (int i = 1; i <= 6; ++i) {coll.push_back(i);}for_each(coll.begin(),coll.end(),add10);std::for_each(coll.begin(),coll.end(),PrintInt());
}
  • 如果需要數個不同的固定數值? 而且他們在編譯期 都已經確認,可以使用template?
  • 使用模板傳參,需要在函數被調用之前將數值傳遞給函數?
  • ?具體的代碼如下面所示,? ? for_each(coll.begin(),coll.end(),AddValue(10));這種方式,使用AddValue(10)生成一個AddValue的組件,并且賦予了初值為10,構造函數就會把10保存在成員theValue中,在for_each之內,針對coll的每一個元素調用 () ,實際上就是對傳入的那個AddValue對象 暫時調用 operator()操作,并以容器的元素作為參數
class AddValue{
private:int theValue;
public:AddValue(int v):theValue(v){};void operator()(int& elem)const{elem += theValue;}
};
class PrintInt{
public:void operator()(int elem)const{std::cout << elem << " ";}
};
int main(){std::vector<int>coll{};for (int i = 1; i <= 6; ++i) {coll.push_back(i);}for_each(coll.begin(),coll.end(),AddValue(10));std::for_each(coll.begin(),coll.end(),PrintInt());std::cout << std::endl;for_each(coll.begin(),coll.end(),AddValue(*coll.begin()));std::for_each(coll.begin(),coll.end(),PrintInt());
}
  • ?? ? for_each(coll.begin(),coll.end(),AddValue(*coll.begin()+5));這種方式,傳入的參數
  • 使用這個技術就可以實現先前所說的 一個函數,兩種狀態的問題,用兩個不同的仿函數實現
class AddValue{
private:int theValue;
public:AddValue(int v):theValue(v){};void operator()(int& elem)const{elem += theValue;}
};
class PrintInt{
public:void operator()(int elem)const{std::cout << elem << " ";}
};
int main(){std::vector<int>coll{};for (int i = 1; i <= 6; ++i) {coll.push_back(i);}AddValue addx(4);for_each(coll.begin(),coll.end(),addx);std::for_each(coll.begin(),coll.end(),PrintInt());std::cout << std::endl;AddValue addy(5);for_each(coll.begin(),coll.end(),addy);std::for_each(coll.begin(),coll.end(),PrintInt());
}

?5.9.2 預先定義的仿函數

  • C++標準庫 包含了一些預定義的仿函數 涵蓋了部分的基礎運算
  • 比如排序默認的排序是從小到大,也就是operator < 的缺省排序準則就是 less<>
  • 默認的 std::set<int>coll? ->? set<int,less<int>>coll
  • 反向排列?? set<int,greater<int>>coll

  • negate<int>()? 將傳入的int數值設置為 負數
  • transform()算法 將第一群集的所有元素處理之后轉移到第二群集,如果第二群集的起始地址是自身,就相當于對第一群集的元素進行操作覆蓋
  • transform的另外一種形式,按照某種特定的運算,將兩個群集內的元素處理之后將其結果寫入到第三群集;如下所示,設定 第一群集、第二群集 將兩個群集的元素進行計算,將結果寫回到第三群集

?

class PrintInt{
public:void operator()(int elem)const{std::cout << elem << " ";}
};
int main(){std::set<int,std::greater<int>>coll1;std::deque<int>coll2;for (int i = 1; i <= 9; ++i) {coll1.insert(i);}std::for_each(coll1.begin(),coll1.end(),PrintInt());transform(coll1.begin(),coll1.end(), //sourceback_inserter(coll2), //destinationbind2nd(multiplies<int>(),10)); //operationstd::cout << std::endl;std::for_each(coll2.begin(),coll2.end(),PrintInt());//replace value equals to 70 with 42replace_if(coll2.begin(),coll2.end(), //rangebind2nd(equal_to<int>(),70), //replace criterion42); //new valuestd::cout << std::endl;std::for_each(coll2.begin(),coll2.end(),PrintInt());//remove all elements with values less than 50coll2.erase(remove_if(coll2.begin(),coll2.end(), //rangebind2nd(less<int>(),50)), //remove criterioncoll2.end());std::cout << std::endl;std::for_each(coll2.begin(),coll2.end(),PrintInt());
  • ? ? transform(coll1.begin(),coll1.end(), //source
    ? ? ? ? ? ? ? back_inserter(coll2), //destination
    ? ? ? ? ? ? ? bind2nd(multiplies<int>(),10)); //operation
  • bind2nd 就是? 進行multiplies<int>()運算的時候,將源群集的元素作為第一參數,將10 作為第二參數

  • 所有的仿函數通常都聲明為inline,一方面使用類似函數的表示法或者抽象性,一方面又可以獲得出色的效能
  • 還有一些仿函數可以調用群集內的每個元素的成員函數?

?

?

?

?

  • 智能指針:是一種對象,有著類似指針的接口,但是內部實現了一些額外的檢查和處理工作?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446374.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446374.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中科大 計算機網絡15 DNS域名解析系統

DNS的必要性 DNS域名解析系統&#xff1a;不是直接給人使用的&#xff0c;而是給其他應用使用的 域名到IP地址的轉換【使用&#xff1a;web應用&#xff0c;FTP應用。。。】 在應用層跑的基礎設施&#xff0c;為其他應用而使用 網絡層的工作的設備使用IP地址&#xff0c;用來…

面試題目匯總

1&#xff0c;for循環的時間復雜度 兩層for循環 第二層中 的循環變量繼承與上層變量時間復雜度是O(n^2)for循環時間復雜度算法理解_bingkxin的專欄-CSDN博客_for循環時間復雜度 for(int i0;i<N;i) {for(int ji;j<N;j){//此處運行次數:NN-1N-2...1123...NN(N1)/2} } for(…

C++基礎1 數據類型 常量

使用Dev CPP作為編程環境、 注意dev cpp5.4.0沒有格式化代碼功能&#xff0c;不要再設置了 設置的常用快捷鍵 CtrE:多行注釋 CtrlShiftE:取消多行注釋 CtrlZ&#xff1a;撤銷 CtrlShiftZ:取消撤銷 CtrlL:折疊函數 CtrlShifL:取消折疊函數 設置Dev Cpp Dev C初始化&#xf…

amd核芯顯卡控制面板自定義分辨率_顯卡天梯圖2020最新版 2020年5月顯卡排行榜天梯圖...

轉眼五月份就到來了&#xff0c;最近各大廠商可謂是你方唱罷我登場啊&#xff0c;發布會一場接著一場&#xff0c;新品和概念產品等一個接著一個的放出&#xff0c;我相信很多小伙伴們都迫不及待了&#xff01;~下面和小編一起來看看吧。2020年5月顯卡排行榜天梯圖&#xff1a;…

Python學習9 面向對象 類和對象

面向對象和面向過程 類和對象 類的設計 類的創建 self:相當于當前對象&#xff1b;類似于Java中的this 類的創建和使用&#xff1a; #類的命名&#xff1a;每個單詞首字母大寫 class Dog:#屬性name dogage 11#方法def eat(self):print(eat rice!)dog Dog() print(dog.n…

刷機提示圖像和設備不匹配_安卓5.0升級失敗如何解決 安卓5.0刷機失敗解決方法介紹【教程】...

安卓5.0升級失敗怎么辦?安卓5.0刷機失敗急救方法?谷歌發布了適用于Nexus系列的Android 5.0系統&#xff0c;但是&#xff0c;刷安卓5.0系統時遇到system.img系統鏡像找不到的錯誤提示是怎么回事?谷歌終于發布了適用于Nexus系列的Android 5.0底包和OTA推送&#xff0c;不過第…

華為模擬器eNSP1

eNSP介紹 網絡仿真工具平臺 路由器AR

postman 不安全網站_接口工具分析(apipost、jmeter、postman)

一、接口都有哪些類型&#xff1f;接口一般分為兩種&#xff1a;1.程序內部的接口 2.系統對外的接口系統對外的接口&#xff1a;比如你要從別的網站或服務器上獲取資源或信息&#xff0c;別人肯定不會把 數據庫共享給你&#xff0c;他只能給你提供一個他們寫好的方法來獲取數據…

HPPTS如何保證通信雙方的安全性

HTTPS原理和通信流程 - 知乎

java-web前端 javascript

介紹 JavaScript是Web中一種功能強大的腳本語言&#xff0c;被設計為向 HTML 頁面增加交互性&#xff0c;常用來為網頁添加各式各樣的動態功能&#xff0c;它不需要進行編譯&#xff0c;直接嵌入在HTML頁面中&#xff0c;就可以把靜態的頁面轉變成支持用戶交互并響應事件的動態…

C++筆試記錄 2021年9月16日

1&#xff0c;函數模板缺省情況下都是內聯的 需要進一步的學習 父類析構函數為非虛函數&#xff0c;子類為虛函數_zhl11a的專欄-CSDN博客_父類的析構函數是非虛的父類析構函數為非虛函數&#xff0c;子類為虛函數 delete子類指針(指向這個子類對象)會調用父類的析構函數 #i…

clientdataset 過濾 in_江門馬弗過濾科技有限公司

點擊藍字關注我們江門馬弗過濾科技有限公司成立于 2020 年&#xff0c;公司位于江門市江海區高新技術開發區&#xff0c;注冊資金 500 萬&#xff0c;工廠面積約 5185 平方米。我們致力于重型汽車空氣過濾器產品的專業制造與研發,為商用車輛及工程車輛等提供過濾系統解決方案的…

java-web前端 CSS

CSS介紹 CSS 指的是層疊樣式表* (Cascading Style Sheets), 描述了如何在屏幕、紙張或其他媒體上顯示 HTML 元素,節省了大量工作&#xff0c;并且可以同時控制多張網頁的布局 外部樣式表存儲在 CSS 文件中 CSS&#xff1a;也稱級聯樣式表。 CSS語法 選擇器指向您需要設置樣式…

c++網吧計費系統_云游戲火了,中國14萬家網吧走向何處?

日前微軟與谷歌兩大科技巨頭紛紛宣布其在云游戲布局的最新進展&#xff0c;一時間云游戲成為游戲圈的熱門詞匯。作為云游戲一大落地場景&#xff0c;網吧這一發展了二十余年的產業&#xff0c;又將迎來新的變量。一些觀點認為云游戲將大幅降低網吧的硬件成本&#xff0c;解決網…

undefined reference to `std::ios_base::Init::Init() 解決

undefined reference to std::ios_base::Init::Init() 解決 &#xff08;一&#xff09;gcc 編譯C程序是提示錯誤undefined reference to std::ios_base::Init::Init() 的解決方法 在linux下編譯c 程序要使用g 編譯器,如果你要是使用gcc編譯器就會有上面的報錯信息,只要在在g…

Python學習10 內置屬性 對象屬性 類屬性 私有屬性 私有方法 對象方法 類方法 靜態方法

內置屬性 創建類時系統自動創建的屬性 # 內置屬性&#xff1a;dir(對象)&#xff0c;列出所有的內置屬性 class Person(object):Person類1# Person類2__slots__ (name, age)def __init__(self, name, age):self.name nameself.age agedef eat(self):print("eat!!!…

fastreport 上一行_創業天下全球總裁袁麗軍一行蒞臨平川區 電商農特產扶貧展館考察指導工作...

6 月12 日&#xff0c;創業天下全球總裁袁麗軍帶領考察組一行來平川區電商農特產扶貧展館指導電商工作。區商務局局長馮月莉、區電子商務服務中心主任李守虎陪同考察。考察中&#xff0c;袁麗軍一行就我區電商農特產扶貧展館工作開展情況、平臺運營情況、物流配送、產品商標注冊…

滴滴筆試準備 項目分配利益最大化

思路&#xff1a;求取每一列的最大數值之和 #include <iostream> #include <vector>int row,column;int main(){std::cin >> row >> column;std::vector<std::vector<int>>input(row, std::vector<int>(column, 0));for (int i 0; …

Java web后端5 JSP技術

JSP概述 HTML代碼與Java代碼共同存在 瀏覽器中顯示 啟動Tomcat 瀏覽器訪問&#xff1a;http://localhost:8083/JSPWeb_war_exploded/hello.jsp <%--Created by IntelliJ IDEA.User: DQDate: 2021/10/20Time: 9:30To change this template use File | Settings | File T…

listview bcb 行的顏色_文明交通安全行手抄報簡單又漂亮

在生活中我們要特別注意交通安全&#xff0c;因為生命是寶貴的。全國交通安全日將至&#xff0c;下面小編給大家準備了文明交通安全行手抄報&#xff0c;一起來學習交通安全知識吧!文明交通安全行手抄報交通安全常識出家門&#xff0c;路邊走&#xff0c;交通法規要遵守;過馬路…