deque插入/删除元素
deque 容器中,無論是添加元素還是刪除元素,都只能借助 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 <deque> #include <iostream> using namespace std; int main() { deque<int>d; //調用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 所示。
?
| 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() 函數的這幾種用法:
?
運行結果為:
1,3,2,5,5,7,8,9,10,11
emplace系列函數的優勢
有關 emplace()、emplace_front() 和 emplace_back() 分別和 insert()、push_front() 和 push_back() 在運行效率上的對比,可以通過下面的程序體現出來:
? #include <deque> #include <iostream> 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和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; }運行結果為:
emplace:
調用構造函數
insert:
調用構造函數
調用移動構造函數
emplace_front:
調用構造函數
push_front:
調用構造函數
調用移動構造函數
emplace_back:
調用構造函數
push_back:
調用構造函數
調用移動構造函數
可以看到,相比和它同功能的函數,emplace 系列函數都只調用了構造函數,而沒有調用移動構造函數,這無疑提高了代碼的運行效率。
總結
以上是生活随笔為你收集整理的deque插入/删除元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vector插入/删除元素
- 下一篇: list插入/删除元素