push_front()增加多種新元素方法
阿新 • • 發佈:2020-10-08
前面章節介紹瞭如何建立 list 容器,在此基礎上,本節繼續講解如何向現有 list 容器中新增或插入新的元素。
list 模板類中,與“新增或插入新元素”相關的成員方法有如下幾個:
- push_front():向 list 容器首個元素前新增新元素;
- push_back():向 list 容器最後一個元素後新增新元素;
- emplace_front():在容器首個元素前直接生成新的元素;
- emplace_back():在容器最後一個元素後直接生成新的元素;
- emplace():在容器的指定位置直接生成新的元素;
- insert():在指定位置插入新元素;
- splice():將其他 list 容器儲存的多個元素新增到當前 list 容器的指定位置處。
以上這些成員方法中,除了 insert() 和 splice() 方法有多種語法格式外,其它成員方法都僅有 1 種語法格式,下面程式演示了它們的具體用法。
#include <iostream> #include <list> using namespace std; int main() { std::list<int> values{1,2,3}; values.push_front(0);//{0,1,2,3} values.push_back(4); //{0,1,2,3,4} values.emplace_front(-1);//{-1,0,1,2,3,4} values.emplace_back(5); //{-1,0,1,2,3,4,5} //emplace(pos,value),其中 pos 表示指明位置的迭代器,value為要插入的元素值 values.emplace(values.end(), 6);//{-1,0,1,2,3,4,5,6} for (auto p = values.begin(); p != values.end(); ++p) { cout << *p << " "; } return 0; }
輸出結果為:
-1,0,1,2,3,4,5,6
list insert()成員方法
insert() 成員方法的語法格式有 4 種,如表 1 所示。
表 1 insert() 成員方法語法格式
語法格式 | 用法說明 |
---|---|
iterator insert(pos,elem) | 在迭代器 pos 指定的位置之前插入一個新元素 elem,並返回表示新插入元素位置的迭代器。 |
iterator insert(pos,n,elem) | 在迭代器 pos 指定的位置之前插入 n 個元素 elem,並返回表示第一個新插入元素位置的迭代器。 |
iterator insert(pos,first,last) | 在迭代器 pos 指定的位置之前,插入其他容器(例如array、vector、deque 等)中位於 [first,last) 區域的所有元素,並返回表示第一個新插入元素位置的迭代器。 |
iterator insert(pos,initlist) | 在迭代器 pos 指定的位置之前,插入初始化列表(用大括號 { } 括起來的多個元素,中間有逗號隔開)中所有的元素,並返回表示第一個新插入元素位置的迭代器。 |
下面的程式演示瞭如何使用 insert() 方法向 list 容器中插入元素。
#include <iostream> #include <list> #include <array> using namespace std; int main() { std::list<int> values{ 1,2 }; //第一種格式用法 values.insert(values.begin() , 3);//{3,1,2} //第二種格式用法 values.insert(values.end(), 2, 5);//{3,1,2,5,5} //第三種格式用法 std::array<int, 3>test{ 7,8,9 }; values.insert(values.end(), test.begin(), test.end());//{3,1,2,5,5,7,8,9} //第四種格式用法 values.insert(values.end(), { 10,11 });//{3,1,2,5,5,7,8,9,10,11} for (auto p = values.begin(); p != values.end(); ++p) { cout << *p << " "; } return 0; }
輸出結果為:
3 1 2 5 5 7 8 9 10 11
學到這裡,讀者有沒有發現,同樣是實現插入元素的功能,無論是 push_front()、push_back() 還是 insert(),都有以 emplace 為名且功能和前者相同的成員函式。這是因為,後者是C++11 標準新新增的,在大多數場景中,都可以完全替代前者實現同樣的功能。更重要的是,實現同樣的功能,emplace 系列方法的執行效率更高。
有關 list 模板類中 emplace 系列函式執行效率更高的原因,前面在講解 deque 容器模板類中的 emplace 系列函式時已經講過,讀者可閱讀《C++ STL deque容器新增和刪除元素》一節做詳細瞭解。