C++順序容器的賦值與swap
阿新 • • 發佈:2019-02-13
直接賦值與assign(assignment):
//容器初始化 vector<int> var_1{1,2,3,4,5}; vector<int> var_2{9,8,7,6,11,12,13,14}; vector<float> var_f1{1.2,1.3,1.4,1.5}; list<string> boss{"馬雲","馬化騰"}; array<int,9> arra_1{1,2,3}; array<int,9> <arra_2>{123,456,789,1212,3434}; //容器賦值,特殊的是array,他與內建陣列不一樣,內建陣列不允許直接複製,而array則允許,但前提是型別、大小相同 //賦值必須左右操作型別相同 var_1=var_2; arra_1=arra_2; //而assign則允許左右兩個操作型別不同但是相容型別賦值 var_1.assign(var_f1.begin(),var_f1.end());//assign接受var_f1的迭代器範圍,然後把var_f1的值轉換成int賦值給var_1 var_1.assign(11,99);//var_1容器中現在的元素為11個99 name.assign(9,"堅持!");//name容器中有9個”堅持“ arra_1={0};//可以執行 /* *C++primer 說不允許用列表賦值,但是在支援C++11標準的g++編譯器中是可以執行成功的。 *因為在C++11標準新增aray的{}初始化std::initializer_list. */
Swap交換兩個相同容器中的內容
array執行swap操作時會對容器內部元素做交換,故而其交換時間與array數目成正比,也不會使array迭代器和引用關聯到別的容器中。
而其他容器進行swap操作時,不會對容器內部元素進行交換,而是對於容器內部資料結構進行改變。
將內容與其它容器的交換。不在單個元素上呼叫任何移動、複製或交換操作。[string除外]所有迭代器和引用保持合法。 尾後迭代器被非法化。
string 進行swap操作。交換 string 與 其他容器的內容。可能非法化所有迭代器和引用。
//這個例子,會出現意想不到的錯誤,程式編譯成功,執行過程中,正確輸出了迭代器部分,但在end()迭代器之後全是些未知資料。 //所以我此刻的理解是,如果呼叫swap操作,就不能進行開始迭代器與尾後迭代器的判斷了,沒有任何意義了,反而會出錯。 void test(vector<int> &var_int,vector<int> &var_int1) { for(auto beg=var_int1.begin();beg!=var_int1.end();++beg) { if(*beg==var_int1[3]) swap(var_int,var_int1); cout<<*beg<<"\t"; }
什麼叫做對內容的改變而非元素的操作:
個人理解:應該類似於指標的轉換,把一個指向另一個指向 。然後交換所指向的內容。
容器的大小:
vector<int> V{1,2,3,4,5};
V.size()返回一個size_type 無符號型別的值。同樣也可以進行判斷是否為空操作。V.empty(),返回bool值。
V.max_size()返回一個大於或等於該容器所能儲存的最大大小。
我嘗試了一下返回了一個很大的值。
這些順序容器也能進行關係運算,類似與string。(前提是兩個操作物件型別相同)
附帶一張練習時的程式碼:
/* *再次探索C++中的順序容器 *瞭解容器中的具體操作 */ //呼叫庫檔案 using namespace std; //結構體定義區域 struct deqs{ vector<int> num; list<string> name; }; //函式宣告區域 void assignment( vector<int> &value, vector<int> &ll); void toswap(list<string> &value,list<string> &ll); void test(vector<int> &var_int,vector<int> &var_int1); int main() { deqs a,b; a.num={1,2,34,22}; b.num={1,2,3,4,5,6}; deqs str_1,str_2; str_1.name={"小米","華為","騰訊","阿里"}; str_2.name={"Google","Microsoft","Inter","AMD","IBM","Facebook"}; assignment(a.num,b.num); toswap(str_1.name,str_2.name); //容器初始化 vector<int> var_1{1,2,3,4,5}; vector<int> var_2{9,8,7,6,11,12,13,14}; vector<float> var_f1{1.2,1.3,1.4,1.5}; list<string> boss{"馬雲","馬化騰"}; array<int,9> arra_1{1,2,3}; array<int,9> arra_2{123,456,789,1212,3434}; //容器賦值,特殊的是array,他與內建陣列不一樣,內建陣列不允許直接複製,而array則允許,但前提是型別、大小相同 //賦值必須左右操作型別相同 // var_1=var_2; arra_1=arra_2; //而assign則允許左右兩個操作型別不同但是相容型別賦值 // var_1.assign(var_f1.begin(),var_f1.end()); // var_1.assign(11,99); boss.assign(9,"堅持!"); arra_1={1}; test(var_1,var_2); cout<<endl<<"大小:"<<var_f1.size(); cout<<endl<<"最大:"<<var_f1.max_size(); return 0; } //函式定義區域 void assignment( vector<int> &value, vector<int> &ll) { cout<<"賦值之前的a:"<<endl; for(auto i: value) { cout<<i<<"\t"; } cout<<endl; // value=ll; value.assign(6,99); cout<<"賦值之後的a:"<<endl; for(auto i:value) { cout<<i<<"\t"; } cout<<endl; } void toswap(list<string> &value,list<string> &ll) { cout<<"變換之前的str_1:"<<endl; for(auto i: value) { cout<<i<<"\t"; } cout<<endl; cout<<"變換之前的str_2:"<<endl; for(auto i: ll) { cout<<i<<"\t"; } cout<<endl; swap(value,ll); cout<<"變換之後的str_1:"<<endl; for(auto i:value) { cout<<i<<"\t"; } cout<<endl; cout<<"變換之後的str_2:"<<endl; for(auto i:ll) { cout<<i<<"\t"; } cout<<endl; } void test(vector<int> &var_int,vector<int> &var_int1) { int i=0; for(auto beg=var_int1.begin();i<7;++beg) { if(*beg==var_int1[3]) swap(var_int,var_int1); cout<<*beg<<"\t"; i++; } /*void test(vector<int> &var_int,vector<int> &var_int1) { for(auto beg=var_int1.begin();beg!=var_int1.end();++beg) { if(*beg==var_int1[3]) swap(var_int,var_int1); cout<<*beg<<"\t"; }*/ }
Run:
bin/ch2$ ./deq 賦值之前的a: 123422 賦值之後的a: 999999999999 變換之前的str_1: 小米華為騰訊阿里 變換之前的str_2: GoogleMicrosoftInterAMDIBMFacebook 變換之後的str_1: GoogleMicrosoftInterAMDIBMFacebook 變換之後的str_2: 小米華為騰訊阿里 9876111213 大小:4 最大:4611686018427387903
一步一步慢慢學,不怕學的比別人慢,就怕什麼也沒學懂。
----致自己