1. 程式人生 > >C++順序容器的賦值與swap

C++順序容器的賦值與swap

順序容器的賦值與swap

直接賦值與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++中的順序容器
 *瞭解容器中的具體操作
*/

//呼叫庫檔案
#include<iostream>
#include<string>
#include<vector>
#include<array>
#include<deque>
#include<list>
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

一步一步慢慢學,不怕學的比別人慢,就怕什麼也沒學懂。

​ ----致自己