1. 程式人生 > 實用技巧 >push_front()增加多種新元素方法

push_front()增加多種新元素方法

前面章節介紹瞭如何建立 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容器新增和刪除元素》一節做詳細瞭解。