C++ STL deque容器添加和删除元素方法完全攻略
deque 容器中,無論是添加元素還是刪除元素,都只能借助 deque 模板類提供的成員函數(shù)。表 1 中羅列的是所有和添加或刪除容器內(nèi)元素相關(guān)的 deque 模板類中的成員函數(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 <deque> #include <iostream> using namespace std; int main() { deque<int>d; //調(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 所示。
?
| 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ù)的這幾種用法:
?
運(yùn)行結(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() 在運(yùn)行效率上的對比,可以通過下面的程序體現(xiàn)出來:
? #include <deque> #include <iostream> 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和insert cout << "emplace:" << endl; std::deque<testDemo> demo1; demo1.emplace(demo1.begin(), 2); cout << "insert:" << endl; std::deque<testDemo> demo2; demo2.insert(demo2.begin(), 2);//emplace_front和push_front cout << "emplace_front:" << endl; std::deque<testDemo> demo3; demo3.emplace_front(2); cout << "push_front:" << endl; std::deque<testDemo> demo4; demo4.push_front(2);//emplace_back()和push_back() cout << "emplace_back:" << endl; std::deque<testDemo> demo5; demo5.emplace_back(2);cout << "push_back:" << endl; std::deque<testDemo> demo6; demo6.push_back(2); return 0; }運(yùn)行結(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ù),這無疑提高了代碼的運(yùn)行效率。
總結(jié)
以上是生活随笔為你收集整理的C++ STL deque容器添加和删除元素方法完全攻略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: emplace与insert
- 下一篇: MySQL如何添加主键(PRIMARY