91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

扬中市| 贵州省| 永泰县| 米泉市| 丹寨县| 肥西县| 和田市| 静安区| 马公市| 柘城县| 博野县| 宜春市| 新龙县| 新闻| 徐汇区| 拉萨市| 法库县| 平远县| 日土县| 木里| 博客| 怀柔区| 都兰县| 临夏县| 托里县| 深圳市| 永安市| 克拉玛依市| 马公市| 荃湾区| 贵港市| 凌海市| 连州市| 镇江市| 金阳县| 漠河县| 麻栗坡县| 莱西市| 德昌县| 大城县| 衢州市|