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 操作的更多相关文章

  1. c/c++ 标准顺序容器 容器的访问,删除 操作

    c/c++ 标准顺序容器 容器的访问,删除 操作 pop_front:vector,string不支持 pop_back:forward_list不支持 知识点 1,front, back, at 成 ...

  2. [C++ Primer] 第9章: 顺序容器

    顺序容器概述 顺序容器的类型有: 类型 说明 vector 可变长度数组. 支持快速随机访问. deque 双端队列. 支持快速随机访问. list 双向链表. 只支持双向顺序访问. forward_ ...

  3. CH9 顺序容器

    本章主要介绍了标准库顺序容器,包括 顺序容器的公共接口,如构造函数,添加/删除操作等 利用迭代器访问容器 不同顺序容器的差异 string的特殊操作 容器适配器,如栈,队列等 9.1 “按字典序插入到 ...

  4. 【c++ Prime 学习笔记】第9章 顺序容器

    一个容器是特定类型对象的集合 顺序容器中元素的顺序与其加入容器的位置对应 关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器 所有容器类共享公有接口,不同容器按不同方式扩 ...

  5. C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题

    顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...

  6. C++ 顺序容器基础知识总结

    0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...

  7. C++ Primer 第九章 顺序容器

    由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...

  8. C++ 顺序容器

    <C++ Primer 4th>读书笔记 顺序容器内的元素按其位置存储和访问.容器类共享公共的接口,每种容器类型提供一组不同的时间和功能折衷方案.通常不需要修改代码,只需改变类型声明,用一 ...

  9. 顺序容器:vector,deque,list

    1.顺序容器:vector,deque,list 容器类共享公共接口,只要学会其中一种类型就能运用另一种类型.每种容器提供一组不同的时间和功能这种方案,通常不需要修改代码,秩序改变类型声明,每一种容器 ...

随机推荐

  1. 【转载】uCOS系统的思考

    一:  世界潮流,浩浩汤汤,顺之者昌,逆之者亡---孙中山 从80X86到ARM9,再从ARM9到ARM7,平台是越做越简单,但是简单并不是意味着退步,反而是种潮流趋势... 在CISC道路上渐行渐远 ...

  2. JSON数据从MongoDB迁移到MaxCompute最佳实践

    数据及账号准备 首先您需要将数据上传至您的MongoDB数据库.本例中使用阿里云的云数据库 MongoDB 版,网络类型为VPC(需申请公网地址,否则无法与DataWorks默认资源组互通),测试数据 ...

  3. shell高效处理文本(1):xargs并行处理

    xargs具有并行处理的能力,在处理大文件时,如果应用得当,将大幅提升效率. xargs详细内容(全网最详细):https://www.cnblogs.com/f-ck-need-u/p/592592 ...

  4. Perl包和模块(内容来自beginning perl)

    单文件版的perl程序只能用于构建较小的脚本程序.当代码规模较大时,应该遵循下面两条规则来构建程序.这样能将程序的各个部分按功能一个一个地细化,便于维护,也便于后续开发. 能复用的代码放进函数 能复用 ...

  5. C# 插件热插拔

    所谓热插拔就是插件可以 在主程序不重新启动的情况直接更新插件, 网上有很多方案: https://www.cnblogs.com/happyframework/p/3405811.html 如下: 但 ...

  6. C#-变量类型(值类型、引用类型)

    第一次发这样的笔记呢! 这个是在再读基础的时候感觉自己理解的东西吧 变量的类型差异在数据的存储方式不一样,值类型是变量本身直接存储数据,另一个则是存储实际变量的引用, 值类型:都是存储在栈中的,都是直 ...

  7. 谈谈mysql的悲观和乐观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...

  8. JSTL_Core标记库

    一.   说明 如有转载,请标明出处 本博讲解JSTL中的core库 对标记属性进行介绍时,首先介绍必写的属性,然后带有默认值的属性,其次是其余属性,这三类属性中间用空行隔开 二:core标记库库 C ...

  9. 【Java每日一题】20170228

    20170227问题解析请点击今日问题下方的“[Java每日一题]20170228”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...

  10. Springboot@Configuration和@Bean详解

    Springboot@Configuration和@Bean详解 一.@Configuration @Target({ElementType.TYPE}) @Retention(RetentionPo ...