中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

海安县| 六安市| 临沭县| 南江县| 墨竹工卡县| 宜宾市| 西青区| 囊谦县| 邻水| 桦川县| 微博| 大渡口区| 五莲县| 富平县| 天台县| 昌宁县| 济阳县| 中江县| 天全县| 延边| 图们市| 柳江县| 保山市| 睢宁县| 桐乡市| 通辽市| 沽源县| 朔州市| 金昌市| 连南| 安远县| 龙江县| 科技| 调兵山市| 沙田区| 望谟县| 灵璧县| 西丰县| 同德县| 张家港市| 吉木乃县|