栈堆的emplace和push_C++(STL):19---deque之删除和emplace用法
deque 容器中,無論是添加元素還是刪除元素,都只能借助 deque 模板類提供的成員函數。表 1 中羅列的是所有和添加或刪除容器內元素相關的 deque 模板類中的成員函數。
表 1 和添加或刪除deque容器中元素相關的成員函數
成員函數功能push_back()在容器現有元素的尾部添加一個元素,和 emplace_back() 不同,該函數添加新元素的過程是,先構造元素,然后再將該元素移動或復制到容器的尾部。pop_back()移除容器尾部的一個元素。push_front()在容器現有元素的頭部添加一個元素,和 emplace_back() 不同,該函數添加新元素的過程是,先構造元素,然后再將該元素移動或復制到容器的頭部。pop_front()移除容器尾部的一個元素。emplace_back()C++ 11 新添加的成員函數,其功能是在容器尾部生成一個元素。和 push_back() 不同,該函數直接在容器頭部構造元素,省去了復制或移動元素的過程。emplace_front()C++ 11 新添加的成員函數,其功能是在容器頭部生成一個元素。和 push_front() 不同,該函數直接在容器頭部構造元素,省去了復制或移動元素的過程。insert()在指定的位置直接生成一個元素。和 emplace() 不同的是,該函數添加新元素的過程是,先構造元素,然后再將該元素移動或復制到容器的指定位置。emplace()C++ 11 新添加的成員函數,其功能是 insert() 相同,即在指定的位置直接生成一個元素。和 insert() 不同的是,emplace() 直接在容器指定位置構造元素,省去了復制或移動元素的過程。erase()移除一個元素或某一區域內的多個元素。clear()刪除容器中所有的元素。
在實際應用中,常用 emplace()、emplace_front() 和 emplace_back() 分別代替 insert()、push_front() 和 push_back(),具體原因本節后續會講。
以上這些成員函數中,除了 insert() 函數的語法格式比較多,其他函數都只有一種用法(erase() 有 2 種語法格式),下面這段程序演示了它們的具體用法:
#include
#include
using namespace std;
int main()
{
dequed;
//調用push_back()向容器尾部添加數據。
d.push_back(2); //{2}
//調用pop_back()移除容器尾部的一個數據。
d.pop_back(); //{}
//調用push_front()向容器頭部添加數據。
d.push_front(2);//{2}
//調用pop_front()移除容器頭部的一個數據。
d.pop_front();//{}
//調用 emplace 系列函數,向容器中直接生成數據。
d.emplace_back(2); //{2}
d.emplace_front(3); //{3,2}
//emplace() 需要 2 個參數,第一個為指定插入位置的迭代器,第二個是插入的值。
d.emplace(d.begin() + 1, 4);//{3,4,2}
for (auto i : d) {
cout << i << " ";
}
//erase()可以接受一個迭代器表示要刪除元素所在位置
//也可以接受 2 個迭代器,表示要刪除元素所在的區域。
d.erase(d.begin());//{4,2}
d.erase(d.begin(), d.end());//{},等同于 d.clear()
return 0;
}
運行結果為:
3 4 2
這里重點講一下 insert() 函數的用法。insert() 函數的功能是在 deque 容器的指定位置插入一個或多個元素。該函數的語法格式有多種,如表 2 所示。
表 2 insert() 成員函數語法格式
語法格式功能iterator insert(pos,elem)在迭代器 pos 指定的位置之前插入一個新元素elem,并返回表示新插入元素位置的迭代器。iterator insert(pos,n,elem)在迭代器 pos 指定的位置之前插入 n 個元素 elem,并返回表示第一個新插入元素位置的迭代器。iterator insert(pos,first,last) 在迭代器 pos 指定的位置之前,插入其他容器(不僅限于vector)中位于 [first,last) 區域的所有元素,并返回表示第一個新插入元素位置的迭代器。iterator insert(pos,initlist)在迭代器 pos 指定的位置之前,插入初始化列表(用大括號{}括起來的多個元素,中間有逗號隔開)中所有的元素,并返回表示第一個新插入元素位置的迭代器。
下面的程序演示了 insert() 函數的這幾種用法:
#include #include #include using namespace std;int main(){std::deque d{ 1,2 };//第一種格式用法d.insert(d.begin() + 1, 3);//{1,3,2}//第二種格式用法d.insert(d.end(), 2, 5);//{1,3,2,5,5}//第三種格式用法std::arraytest{ 7,8,9 };d.insert(d.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9}//第四種格式用法d.insert(d.end(), { 10,11 });//{1,3,2,5,5,7,8,9,10,11}for (int i = 0; i < d.size(); i++) {cout << d[i] << " ";}return 0;}
運行結果為:
1,3,2,5,5,7,8,9,10,11
emplace系列函數的優勢
有關 emplace()、emplace_front() 和 emplace_back() 分別和 insert()、push_front() 和 push_back() 在運行效率上的對比,可以通過下面的程序體現出來:
#include #include using namespace std;class testDemo{public:testDemo(int num) :num(num) {std::cout << "調用構造函數" << endl;}testDemo(const testDemo& other) :num(other.num) {std::cout << "調用拷貝構造函數" << endl;}testDemo(testDemo&& other) :num(other.num) {std::cout << "調用移動構造函數" << endl;}testDemo& operator=(const testDemo& other);private:int num;};
testDemo& testDemo::operator=(const testDemo& other) {this->num = other.num;return *this;}int main(){//emplace和insertcout << "emplace:" << endl;std::deque demo1;demo1.emplace(demo1.begin(), 2);cout << "insert:" << endl;std::deque demo2;demo2.insert(demo2.begin(), 2);
//emplace_front和push_frontcout << "emplace_front:" << endl;std::deque demo3;demo3.emplace_front(2);cout << "push_front:" << endl;std::deque demo4;demo4.push_front(2);
//emplace_back()和push_back()cout << "emplace_back:" << endl;std::deque demo5;demo5.emplace_back(2);
cout << "push_back:" << endl;std::deque demo6;demo6.push_back(2);return 0;}
運行結果為:
emplace:調用構造函數insert:調用構造函數調用移動構造函數emplace_front:調用構造函數push_front:調用構造函數調用移動構造函數emplace_back:調用構造函數push_back:調用構造函數調用移動構造函數
可以看到,相比和它同功能的函數,emplace 系列函數都只調用了構造函數,而沒有調用移動構造函數,這無疑提高了代碼的運行效率。
總結
以上是生活随笔為你收集整理的栈堆的emplace和push_C++(STL):19---deque之删除和emplace用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬虫可视化界面_python
- 下一篇: mysql使用数据库预处理_php中对M