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