c++ 顺序容器学习
所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素”
而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序。
c++中的顺序容器一共有这么几种:
vector | 可变大小数组 |
deque | 双端队列 |
list | 双向链表 |
forward_list | 单向链表 |
array | 固定数组大小 |
string | 与vector相似的容器,但专门用于保存字符 |
这些容器可以让我们方便地放元素,取元素,but,她们在:添加、删除、非顺序访问,这些方面的性能都是不同滴(根据需要适当选择)
列了一大堆,就是为了有个印象,不知道她们是干啥的,后面慢慢学...
先不要逐个的去学,我们先来看一下共性的东西,下面是所有容器类型都提供的操作
类型别名 | |
iterator | 迭代器 |
const_iterator | 只读迭代器 |
size_type | unsigned int,保证可以存下此种容器的最大可能长度 |
difference_type | int, 足够保存两个迭代器之间的距离,是有符号的 |
value_type | 元素类型 |
reference | 元素的左值类型,即value_type& |
const_reference | 即const value_type & |
构造函数 | |
C c | 默认构造函数,构造空容器 |
C c1(c2) | 构造了c1,内容是拷贝c2的 |
C c(b, e) | 构造c,将迭代器b和e指定的范围内的元素拷贝到c |
C c{a, b, c...} | 列表初始化c |
赋值与swap | |
c1 = c2 |
将c1中的元素替换为c2中的元素 |
c1 = {a,b,c...} | 将c1中的元素替换为列表中的元素(array不适用) |
a.swap(b) | 交换a,b的元素 |
大小 | |
c.size() |
c中元素的数目(forward_list不适用) |
c.max_size() | c可保存的最大元素数目 |
c.empty() | c是否为空,空true,不空false |
添加/删除元素 | |
c.insert(args) | 将args中的元素拷贝进c |
c.emplace(inits) | 使用inits构造c中的一个元素 |
c.erase(args) | 删除args指定的元素 |
c.clear() | 删除c中的所有元素,返回void |
关系运算符 | |
==, != | 是否相等,是否不等 |
<, <=, >. >= | 关系运算符 |
获取迭代器 | |
c.begin(), c.end() | 获取首元素,尾元素之后位置,的迭代器 |
c.cbegin(), c.cend() | 返回const_iterator |
反向容器的额外成员 | |
reverse_iterator | 反着寻址的迭代器 |
const_reverse_interator | 只读的逆序迭代器 |
c.rbegin(), c.rend() | 尾元素,首元素之前的迭代器 |
c.crbegin(), c.crend() | 返回const_reverse_iterator |
好多...我都敲晕乎了
先有蛋才有鸡,首先我们来看“构造函数",一共分这么几种:
(1) 默认初始化; (2) 拷贝初始化; (3) 列表初始化; (4) 迭代器初始化; (5) 顺序容器特有初始化
用vector做个栗子,代码如下:
#include <iostream>
#include <vector> using namespace std; int main()
{
vector<int> vec1; //默认初始化
vector<int> vec2{,,,}; //列表初始化
vector<int> vec3{,,,};
vec3 = vec2;
vector<int> vec4(vec3); //拷贝初始化
vector<int> vec5(vec4.begin()+, vec4.end()-); //迭代器初始化
vector<int> vec6(,); //顺序容器特有初始化
return ;
}
seq_container_definition
执行结果gdb看一下:
好,然后我们来看一下迭代器,以及begin()和end()
迭代器和指针差不多,反正就是让我们来遍历着访问元素的,begin()取到第一个元素,end()取到?尾元素的后一个位置(one past the last element)
下面贴个snippet来看她的使用:
#include <iostream>
#include <string> using namespace std; int main()
{
string s("time for lunch");
string::iterator iter = s.begin();
while(iter != s.end()){
*iter = toupper(*iter);
iter++;
}
cout << s << endl;
return ;
}
seq_container_iterator
注意一点就是:如果你往容器对象里添加或者删除了元素,也即改变了对象容量,那么对象上原有的迭代器就会失效
c++ 顺序容器学习的更多相关文章
- c++ 顺序容器学习 - 容器适配器
摘要: 对 容器适配器 的疑问. 刚开始接触 容器适配器 时,总感觉怪怪的,认为多此一举,顺手搜了搜,原来我在这一点is not alone: STL容器适配器的用途 其中有个老兄说的好,这里 引用一 ...
- C++学习基础四——顺序容器和关联容器
—顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...
- C++系统学习之九:顺序容器
元素在顺序容器中的顺序与其加入容器时的位置相对应.关联容器中元素的位置由元素相关联的关键字值决定.所有容器类都共享公共的接口,不同容器按不同方式对其进行扩展. 一个容器就是一些特定类型对象的集合.顺序 ...
- 【c++ Prime 学习笔记】第9章 顺序容器
一个容器是特定类型对象的集合 顺序容器中元素的顺序与其加入容器的位置对应 关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器 所有容器类共享公有接口,不同容器按不同方式扩 ...
- c/c++ 标准顺序容器 容器的访问,删除 操作
c/c++ 标准顺序容器 容器的访问,删除 操作 pop_front:vector,string不支持 pop_back:forward_list不支持 知识点 1,front, back, at 成 ...
- c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作
c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作 关键概念:向容器添加元素时,添加的是元素的拷贝,而不是对象本身.随后对容器中元素的任何改变都 ...
- C++拾遗(四)——顺序容器
之前一篇博文(<初窥标准库>)简单了解了一种最常用的顺序容器:vector类型.本文将对该文内容进行进一步的学习和完善,继续讨论标准库提供的顺序容器类型.所谓顺序容器,即将单一类型的元素聚 ...
- Java容器学习——List
Java容器学习--List 基础知识 数组: 优点:随机存取,可以快速访问元素 缺点:静态分配内存,存在空间闲置或者溢出现象:不适合进行插入和删除操作,需要移动大量元素. 链表: 优点: ...
- C++ 顺序容器基础知识总结
0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...
随机推荐
- 浅析final 关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- <context:component-scan>使用说明
Spring组件扫描<context:component-scan/>使用详解 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫 ...
- mysql分表技术(学习心得)
(最近在学习mysql优化的一些问题,以下为个人一些收获,如有不足,敬请提出!) 概述:当一个表的数据很大,比如200G,这时太大,我们只靠索引也不好使了,这时我们需要分表和分区处理.分表有两种形式( ...
- PDF 补丁丁 0.5.0.2657 发布
新版本修正了导出图片时由于路径存在空白导致出错.在 Windows 10 和高分辨率显示屏上显示字体模糊.控件尺寸错位等各种问题. 默认显示工具栏.
- Android studio 项目的layout的文件打开,preview 视图无法显示,提示“no sdk found...”可能原因?
1.安装android studio后启动,引导新的下载的sdk文件夹,不要默认在c:\users\你的用户名\appdata...下的sdk文件夹. 2.如果已经默认的,重新在settings/pr ...
- 核心动画与UIView的区别
核心动画与UIView的区别 1.核心动画只作用于layer,使用核心动画之前,必须有layer 2.核心动画只是假象,并没有移动实际位置 什么时候使用核心动画,什么时候使用UIView动画 1.当不 ...
- php防止外链导出的代码
先收藏起来再说! URL跳转代码 1.代码: <? $url=$_GET["url"];header("Location:"."http://& ...
- Qt中常见错误整理(不定期更新)
(1)error: LNK1104: cannot open file 'libboost_thread-vc120-mt-gd-1_57.lib 编译boost库程序时出现问题 解决方法如下: 1. ...
- android studio集成融云 SDK 后在部分机型启动对话时崩溃
最初构建项目是 eclipse, 后来切换到 android studio来做开发. 后来多个用户反馈在android4.4机型上存在启动对话崩溃的问题.但是IOS 版工程从来没有重现. 调试报错信息 ...
- linux -a 到 -z 的意义
shell if判断中常用的也就是绿色部分,尾部部分越看越不懂.从百度文库转载. [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则 ...