c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作
c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作
关键概念:向容器添加元素时,添加的是元素的拷贝,而不是对象本身。随后对容器中元素的任何改变都不会影响到原始对象,反之亦然。
关键警告:因为vector,deque,string的内存存储都是在连续的空间上,所以向vector,deque,string的头尾以外的位置插入元素或者删除元素,会产生元素的移动,就会非常耗时,这时就应该考虑使用双向链表list,但是list不支持下标操作
知识点
1,在容器的尾部插入元素push_back,对应代码里的test1
2,在容器的头部插入元素push_front,对应代码里的test2
3,在容器的任意位置插入单个元素insert ,对应代码里的test3
4,在容器的任意位置插入多个元素insert,对应代码里的test4
5,insert返回新添加的第一个元素,对应代码里的test5
6,emplace_front,emplace,emplace_back,对应代码里的test6
#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <forward_list>
#include <deque>
using namespace std;
int main(){
//test1 push_back
//forward_list没有push_back方法
/*
vector<string> container;
//list<string> container;
//deque<string> container;
//forward_list<string> container;//forward_list没有push_back方法
string word;
while(cin >> word){
container.push_back(word);
}
for(auto const &s : container){
cout << s << " ";
}
cout << endl;
string s("abc");
s.push_back('d');
cout << s << endl;
*/
//test2 push_front
/*
//list<string> container;
deque<string> container;
string word;
while(cin >> word){
container.push_front(word);
}
for(auto const &s : container){
cout << s << " ";
}
cout << endl;
*/
//test3 insert单个元素
//vector和string虽然不支持push_front,但是支持在头部insert
/*
//vector<string> container{"aa","bb","cc"};
//list<string> container{"aa","bb","cc"};
deque<string> container{"aa","bb","cc"};
//vector<string>::iterator it = container.begin();
//list<string>::iterator it = container.begin();
deque<string>::iterator it = container.begin();
container.insert(++it, "ddd");
for(auto const &s : container){
cout << s << " ";
}
cout << endl;
string str("abc");
string::iterator it1 = str.begin();
str.insert(++it1, 'd');
for(auto const &s : str){
cout << s << " ";
}
cout << endl;
*/
//test4 insert范围
/*
vector<string> v{"aa","bb","cc"};
list<string> sl{"dd","ff"};
sl.insert(sl.begin(), v.end() - 2, v.end());
for(auto const &s : sl){
cout << s << " ";
}
cout << endl;
sl.insert(sl.end(), {"ee","gg"});
for(auto const &s : sl){
cout << s << " ";
}
cout << endl;
*/
//test5 使用insert的返回值
//插入到指定的位置之前,返回新添加的第一个元素
/*
list<string> sl;
auto it = sl.begin();
string word;
//下面的代码,相当于push_front
while(cin >> word){
it = sl.insert(it,word);
}
for(auto const &s : sl){
cout << s << " ";
}
cout << endl;
*/
//test6 emplace_front,emplace,emplace_back
//直接在容器里构造对象
class Test{
public:
Test(const string& d = "", int s = 2) : name(d), age(s){}
string getName()const{
return name;
}
int getAge()const{
return age;
}
private:
string name;
int age;
};
list<Test> vc;
vc.emplace_back("aa",10);
vc.emplace_front("bb",12);
vc.emplace(vc.begin(), "cc", 11);
for(auto const &s : vc){
cout << s.getName() << ":" << s.getAge() << endl;
}
}
c/c++ 学习互助QQ群:877684253
本人微信:xiaoshitou5854
c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作的更多相关文章
- c/c++ 标准顺序容器 容器的访问,删除 操作
c/c++ 标准顺序容器 容器的访问,删除 操作 pop_front:vector,string不支持 pop_back:forward_list不支持 知识点 1,front, back, at 成 ...
- [C++ Primer] 第9章: 顺序容器
顺序容器概述 顺序容器的类型有: 类型 说明 vector 可变长度数组. 支持快速随机访问. deque 双端队列. 支持快速随机访问. list 双向链表. 只支持双向顺序访问. forward_ ...
- CH9 顺序容器
本章主要介绍了标准库顺序容器,包括 顺序容器的公共接口,如构造函数,添加/删除操作等 利用迭代器访问容器 不同顺序容器的差异 string的特殊操作 容器适配器,如栈,队列等 9.1 “按字典序插入到 ...
- 【c++ Prime 学习笔记】第9章 顺序容器
一个容器是特定类型对象的集合 顺序容器中元素的顺序与其加入容器的位置对应 关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器 所有容器类共享公有接口,不同容器按不同方式扩 ...
- C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题
顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...
- C++ 顺序容器基础知识总结
0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...
- C++ Primer 第九章 顺序容器
由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...
- C++ 顺序容器
<C++ Primer 4th>读书笔记 顺序容器内的元素按其位置存储和访问.容器类共享公共的接口,每种容器类型提供一组不同的时间和功能折衷方案.通常不需要修改代码,只需改变类型声明,用一 ...
- 顺序容器:vector,deque,list
1.顺序容器:vector,deque,list 容器类共享公共接口,只要学会其中一种类型就能运用另一种类型.每种容器提供一组不同的时间和功能这种方案,通常不需要修改代码,秩序改变类型声明,每一种容器 ...
随机推荐
- transform:scale()妙用——当下拉列表,图片无缝拉升 动画效果
遇到问题 昨天在做音乐播放器的时候,遇到了一个这样的界面: 当下拉scroll区域列表的时候,图片会按照比例无缝连接放大,就想下面的效果图一样 分析问题 从上图可一看到,页面主要由两个div组成, ...
- 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page1-6
前言 大家好.这是开通本号的第一篇文章.从事IT行业已经20年了,从使用PowerBuilder做企业信息系统开始,做了七八年开发,然后转型Java不是很成功,从07年之后,我转做产品经理,机缘巧合, ...
- MySQL的binlog恢复(Windows下)
前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...
- 聊聊数据库~2.SQL环境篇
传统数据库 上篇文章:聊聊数据库~开篇 https://www.cnblogs.com/dotnetcrazy/p/9690466.html 本来准备直接开讲NoSQL的(当时开篇就是说的NoSQL) ...
- Ubuntu使用(一)——常用命令与软件安装配置
1.安装输入法 2.配置JDK 3.eclipse 3.1 eclipse启动错误 修改eclipse.init的配置,主要加-vm以及下面的jre路径,路径前别留空格 之前因为加了空格,一直找不到原 ...
- [转]Rancher 快速上手指南操作(1)
本文转自:http://www.cppblog.com/zhiyewang/archive/2016/03/17/213053.aspx Rancher 快速上手指南操作(1)该指南知道用户如何快速的 ...
- 谈谈知识的融会贯通:以“java中的迭代器失效问题”为例
提示 文中涉及知识点: Collection . Iterator Guava 中的 Lists.partition 方法 如果你对这两个知识点不了解,强烈建议阅读文中引用的参考文章. 场景一:以Ar ...
- Java高并发--AQS
Java高并发--AQS 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 AQS是AbstractQueuedSynchronizer的简称,直译过来是抽象队列同步器. ...
- Eclipse中SVN插件的安装和配置(离线安装)
Eclipse利用svn的离线安装包进行配置svn,这种方式配置起来很简单,但是前提是必须下载可用的的svn离线包.因为有的从网上下载的svn离线包有问题. 第一步:下载svn离线包 我下载的是下面这 ...
- 为啥JQuery被淘汰了?
摘要: 技术进步永不止步. 原文:jQuery的没落和技术发展的一般规律 作者:凌霄光 Fundebug经授权转载,版权归原作者所有. jQuery的成就 jQuery是一个伟大的库, 它解决了dom ...