
deque插入/删除元素
下面的程序演示了 insert() 函数的这几种用法:
发布日期:2021-05-07 00:53:24
浏览次数:17
分类:技术文章
本文共 3996 字,大约阅读时间需要 13 分钟。
deque 容器中,无论是添加元素还是删除元素,都只能借助 deque 模板类提供的成员函数。表 1 中罗列的是所有和添加或删除容器内元素相关的 deque 模板类中的成员函数。
成员函数 | 功能 |
---|---|
push_back() | 在容器现有元素的尾部添加一个元素,和 emplace_back() 不同,该函数添加新元素的过程是,先构造元素,然后再将该元素移动或复制到容器的尾部。 |
pop_back() | 移除容器尾部的一个元素。 |
push_front() | 在容器现有元素的头部添加一个元素,和 emplace_back() 不同,该函数添加新元素的过程是,先构造元素,然后再将该元素移动或复制到容器的头部。 |
pop_front() | 移除容器尾部的一个元素。 |
emplace_back() | 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(){deque 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 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。 |
#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::array test{ 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 系列函数都只调用了构造函数,而没有调用移动构造函数,这无疑提高了代码的运行效率。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月12日 14时38分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
windows下端口查询进程查询以及杀死进程
2019-03-04
条款21:必须返回对象时,别妄想返回其reference
2019-03-04
条款23:宁以non-member、non-friend替换member函数
2019-03-04
条款25: 考虑写出一个不抛异常的swap函数
2019-03-04
对用户ID、组ID、附属组ID、有效、实际、设置用户、设置组ID等的理解
2019-03-04
前端基础——HTML(一)
2019-03-04
协议分层
2019-03-04
gcc 与g++
2019-03-04