日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL 容器中的元素必须满足的条件

發布時間:2023/12/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL 容器中的元素必须满足的条件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? STL中的容器、迭代器、算法都是模板,因此可以操作任何型別。不論是STL預先定義好的或用戶自行定義的都可以。然而,由于某些加諸于元素身上的操作行為,某些需求條件也就相應出現了。STL容器元素必須滿足以下三個基本條件:

  • ?必須可通過拷貝復制構造函數進行復制。副本與原本必須相等,亦即所有相等測試的結果必須顯示原本和副本行為一致。 所有容器都會在內部生成一個元素副本,并返回該暫時性副本,因此拷貝構造函數會被頻繁地調用。所以拷貝構造函數的性能應該盡可能地優化,雖然這不是必須的條件之一,但可視為獲得良好性能的訣竅。如果對象的拷貝需要耗費大量的時間,你可以選用基于引用計數的智能指針來使用容器,從而避免拷貝對象帶來的性能開銷。
  • ?必須可以通過operator = 賦值操作符來完成賦值動作。容器和算法都會使用operator = 才能以新元素改寫或取代舊元素。
  • ?必須可以透過析構函數完成動作的銷毀。當容器元素被移除,容器內的副本將被銷毀,因此析構函數絕對不能設計為private。此外,依C++慣例,析構函數絕對不能拋出異常。
  • ? ?? 這三個條件對任何class而言其實都是隱式成立的。如果某個class既沒有為上述動作定義特殊版本,也沒定義任何“可能破壞這些動作之健全性的”特殊成員,那么它自然而然也就滿足了上述條件。下面幾個條件也得滿足:

    • ?對序列式容器而言,元素的defaut構造函數必須可用。 我們可以在沒有給予任何初值的情況下,創建一個非空容器,或增加容器的元素個數,這些元素都將以default構造函數完成。
    • ?對于某些動作,必須定義operator = = 以執行相等測試。如果你有搜尋需求,這一點很重要。
    • ?在關聯式容器中,元素必須定義出排序準則。缺省情況下 operator<, 透過仿函數less<>調用。

    #include<vector> using std::vector; class dansir { public:dansir() = delete;dansir(const dansir&) = delete;dansir& operator = (const dansir&) = delete; }; int main(int argc, char *argv[]) {vector<dansir> vtDir; // 此處會報錯,因為默認構造函數被刪除了,不存在默認構造函數vector<dansir> vtDir1;vtDir = vtDir1; // 此處會報錯,因為賦值函數被刪除了,不存在賦值函數return 0; } #include<vector> using std::vector; class dansir { public:dansir() {};~dansir() = delete; }; int main(int argc, char *argv[]) {vector<dansir> vtDir; dansir s; vtDir.push_back(s); vtDir.erase(vtDir.begin()); // 此處會報錯,因為erase會調用dansir的析構函數,而析構函數被刪除了 return 0; }

    ? ? ? ? ?

    總結

    以上是生活随笔為你收集整理的STL 容器中的元素必须满足的条件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。