亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++11的swap怎么使用

發布時間:2021-11-29 11:31:14 來源:億速云 閱讀:191 作者:iii 欄目:大數據

這篇文章主要介紹“C++11的swap怎么使用”,在日常操作中,相信很多人在C++11的swap怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++11的swap怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

假設有下面的數據類:

struct TestData{
   TestData(int _size)
       :size(_size)
   {
       data= new int[size];
   }
   ~TestData(){
       if(data != nullptr){
           delete data;
       }
   }
   TestData(const TestData& d)
   {
       size = d.size;
       if(data != nullptr){
           delete data;
       }
       data = new int[size];
       memcpy(data, d.data, size * sizeof(int));
   }
   TestData& operator=(const TestData& d)
   {
       size = d.size;
       if(data != nullptr){
           delete data;
       }
       data = new int[size];
       memcpy(data, d.data, size * sizeof(int));
       return *this;
   }
   
   int size = 0;
   int* data = nullptr;
};

這時一個簡單的數據類,定義了一個拷貝構造函數和一個賦值運算符。它們都實現了深拷貝。

C++11之前的swap

先看swap的實現:

template<classT>voidswap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}

下面結合示例下面的代碼看看發生了什么。

當swap調用了T C(a)的時候,實際上是調用了拷貝構造函數,當swap代碼調用了賦值操作時,實際上是調用了賦值運算符。

由于拷貝構造函數和賦值運算符包含內存拷貝操作,而這樣的操作共執行了三次,所以在一個swap中一共存在三次內存拷貝的操作。這種不必要的內存操作很多情況下都會影響C++的執行效率。

C++11之后的swap

引入了右值引用和數據移動的概念之后,代碼變成下面的樣子:

template<classT>voidswap (T& a, T& b)
{
  T c(std::move(a)); a=std::move(b); b=std::move(c);
}

由于std::move將變量類型轉換為右值引用,TestData有機會提供下面針對右值引用的構造函數和賦值運算符。

TestData(TestData&& d)
   :size(d.size)
   ,data(d.data)
{
   d.size = 0;
   d.data = nullptr;
}
TestData& operator=(const TestData&& d)
{
   size = d.size;
   data = d.data;
   return *this;
}

到此,關于“C++11的swap怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吴桥县| 祁门县| 裕民县| 邹平县| 新密市| 定远县| 边坝县| 涟源市| 泽州县| 淮阳县| 墨竹工卡县| 水富县| 黄浦区| 陆河县| 灵丘县| 富锦市| 黎川县| 和田市| 页游| 呼伦贝尔市| 中山市| 玛多县| 文安县| 辛集市| 阿拉善盟| 栾川县| 嫩江县| 枣强县| 灵丘县| 陕西省| 南溪县| 固始县| 阿拉善右旗| 大埔区| 旺苍县| 含山县| 阿合奇县| 岑溪市| 西藏| 西平县| 南郑县|