<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 標準庫中容器方面的改進 新的語言特性和近10年來的經驗會給標準庫中的容器帶來啥改進呢?首先,新容器類型:array(大小固定容器),forward_list (單向鏈表),unordered containers(哈希表,無序容器)。其次,新特性:initializer lists(初始化列表),rvalue references(右值引用),variadic templates(可變參數模板),constexpr(常量表達式)。下邊均以vector為例加以介紹: * 初始化列表(Initializer lists):最顯著的改進是容器的構造函數可以接受初始化列表來作為參數: ``` vector<string> vs = { "Hello", ", ", "World!", "\n" }; for (auto s : vs ) cout << s; ``` * move操作:容器新增了move版的構造和賦值函數(作為傳統copy操作的補充)。它最重要的內涵就是允許我們高效的從函數中返回一個容器: ``` vector<int&gt; make_random(int n) { vector<int&gt; ref(n); // 產生0-255之間的隨機數 for(auto x& : ref) x = rand_int(0,255); return ref; } vector<int> v = make_random(10000); for (auto x : make_random(1000000)) cout << x << '\n'; ``` 上邊代碼的關鍵點是vector沒有被拷貝操作(譯注:vector ref的內存空間不是應該在函數返回時被stack自動回收嗎?move assignment通過右值引用精巧的搞定了這個問題)。對比我們現在的兩種慣用法:在自由存儲區來分配vector的空間,我們得負擔上內存管理的問題了;通過參數傳進已經分配好空間的vector,我們得要寫不太美觀的代碼了(同時也增加了出錯的可能)。 * 改進的push操作:作為我最喜愛的容器操作函數,push_back()允許我們優雅的增大容器: ``` vector<pair<string,int>> vp; string s; int i; while(cin&gt;&gt;s&gt;&gt;i) vp.push_back({s,i}); ``` 如上代碼通過r和i構造了一個pair對象,然后將它move到vp中。注意這里是”move”而不是”copy”。這個push_back版本接受了一個右值引用參數,因此我們可以從string的移動構造函數(move constructor)(譯注:直接由拷貝構造函數(copy ctor)對應而來)中獲益。同時使用了[統一初始化語法](unified initializer syntax)來避免哆嗦。 * 原地安置操作(Emplace operations):在大多數情況下,push_back()使用移動構造函數(而不是拷貝構造函數)來保證它更有效率,不過在極端情況下我們可以走的更遠。為何一定要進行拷貝/移動操作?為什么不能在vector中分配好空間,然后直接在這個空間上構造我們需要的對象呢?做這種事兒的操作被叫做”原地安置”(emplace,含義是:putting in place)。舉一個emplace_back()的例子: ``` vector<pair<string,int>> vp; string s; int i; while(cin&gt;&gt;s&gt;&gt;i) vp.emplace_back(s,i); ``` emplace_back()接受了可變參數模板變量并通過它來構造所需類型。至于emplace_back()是否比push_back()更有效率,取決于它和可變參數模板的具體實現。如果你認為這是一個重要的問題,那就實際測試一下。否則,就從美感上來選擇它們吧。到目前為止,我更喜歡push_back(),不過只是目前哦。 * Scoped allocators:現在容器中可以持有”擁有狀態的空間分配對象(allocationobjects)”了,并通過它來進行”nested/scoped”方式的空間分配(譯注:原文:use those to control nested/scoped allocation )(舉例:為容器中的元素分配空間)。 顯然,容器不是唯一從新語言特性中獲益的標準庫部分: * 編譯期計算(Compile-time evaluation):常量表達式 為bitset, duration, char_traits, array, atomic types, random numbers, complex等類型引入了編譯期計算。對于某些情況,這意味著性能上的改善;而對于其它情況(無法編譯期優化的情況下),則意味著可以減少晦澀代碼和宏的使用了。 * 元組(Tuples):如果沒有可變參數模板 ,它就不存在了。 (翻譯:interma)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看