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做个栗子,代码如下:

 1 #include <iostream>
 2 #include <vector>
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     vector<int> vec1; //默认初始化
 9     vector<int> vec2{1,2,3,4};  //列表初始化
10     vector<int> vec3{5,6,7,8};
11     vec3 = vec2;
12     vector<int> vec4(vec3); //拷贝初始化
13     vector<int> vec5(vec4.begin()+1, vec4.end()-1); //迭代器初始化
14     vector<int> vec6(10,2);  //顺序容器特有初始化
15     return 0;
16 }

seq_container_definition

执行结果gdb看一下:

好,然后我们来看一下迭代器,以及begin()和end()

迭代器和指针差不多,反正就是让我们来遍历着访问元素的,begin()取到第一个元素,end()取到?尾元素的后一个位置(one past the last element)

下面贴个snippet来看她的使用:

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     string s("time for lunch");
 9     string::iterator iter = s.begin();
10     while(iter != s.end()){
11         *iter = toupper(*iter);
12         iter++;
13     }
14     cout << s << endl;
15     return 0;
16 }

seq_container_iterator

注意一点就是:如果你往容器对象里添加或者删除了元素,也即改变了对象容量,那么对象上原有的迭代器就会失效

时间: 2024-10-29 00:18:57

c++ 顺序容器学习的相关文章

C++顺序容器学习小结

C++顺序容器 一. C++数组的描述 一维数组的动态内存分配: Int *num=new int[len]; delete []num; 二维数组的动态内存分配: 1.知第二维 char (*num)[N];//指向数组的指针 num = newchar[m][N]; delete[]num; 2.知第一维 char*num [M];//指针的数组 for(int i=0; i<M; i++) num[i] = new char[n]; for(i=0; i<M; i++) delete[]

c++ 顺序容器学习 - 容器适配器

摘要: 对 容器适配器 的疑问. 刚开始接触 容器适配器 时,总感觉怪怪的,认为多此一举,顺手搜了搜,原来我在这一点is not alone: STL容器适配器的用途 其中有个老兄说的好,这里 引用一下: 1 adapter原意是插座.适配器.接合器的意思.现在我需要一个栈结构,我们可以用deque来实现,只在一端进行元素插入和弹出,另一端不动.这说明deque可以用作一个栈结构,但它又不能直接地严格地满足你的要求,因为你不能防止别人在另一端乱动你的东西.你需要对它进行一些包装,作一些限制,使之

Accelerated C++学习笔记7—&lt;使用顺序容器并分析字符串&gt;

第6章  使用库算法 本章中主要教我们如何使用几个库算法来解决与处理字符串和学生成绩相关的问题. 1.分析字符串 使用一个循环来连接两幅字符图案 for(vector<string>::const_iterator it = bottom.begin(); it != bottom.end(); ++it) ret.push_back(*it);</span> 等价于 ret.insert(ret.end(), bottom.begin(), bottom.end());</

C++学习之顺序容器(一)

一个容器就是一些特定类型对象的集合.顺序容器(sequential container)为我们提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置向对应. 顺序容器类型概述 容器名称 容器特性 访问特性 修改特性 vector 可变大小数组 随机 尾部插入/删除速度快 deque 双端队列 随机 头尾位置插入/删除速度快 list 双向链表 双向顺序 任意位置插入/删除均很快 forward_list 单项链表 单向顺序 任意位置插入/删除均很快 array

【STL容器学习笔记】-顺序容器

STL提供了三个顺序容器:vector.list和deque.Vector和deque都是用数组来实现的,list是用链表来实现的.关于三者的实现原理和各自应用的场景我们做一下分析. 1.vector就是动态数组,它是在堆中分配内存,如果vector中元素个数大于当前大小时,就会再分配内存.它拥有一段连续的内存空间,并且起始地址不变,因此它能很好地支持随机访问元素,即[ ]操作符.vector对末尾元素进行操作(添加或者删除元素)最快,因为不用移动内存.但如果是在中间位置插入或者删除元素,因为要

C++学习基础四——顺序容器和关联容器

—顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue> (1)vector声明 vector<string> svec;(2)添加元素: c.push_back(t): 在容器 c 的尾部添加值为 t 的元素.返回 void 类型  c.push_front(t):在容器 c 的前端添加值为 t 的元素.返回 void 类型 只适用于 lis

C++ Primer学习总结 第9章 顺序容器

第9章 顺序容器 1.    顺序容器如果有一个只需要容器大小参数的默认构造函数,该函数使用的是元素的默认构造函数来构造每个元素对象,如果该容器的元素没有默认构造函数,那么就不能使用这个容器的该构造函数P294: 2.    容器进行拷贝初始化时,两个容器的元素必须同类型. 但是如果列表初始化,或迭代器范围初始化容器,那么只要求列表中元素或迭代器所指元素可以转化为容器的元素即可. 3.    容器类型可以直接通过=号赋值(包括array容器数组类型): 注意:assign仅适用于顺序容器(但不适

c++容器学习

转:http://blog.csdn.net/zhanghaodx082/article/details/17919401 1,using学习 两种方式:第一,完全引入命名空间y,如,using namespace std; 以后要用std中定义的符号就方便了,如cin>> ; 第二,只引入要用的符号,如,using std::cin; 注意:.h头文件中,最好不要只用第一种方式,因为.h文件在预处理时会完全复制到.cpp文件中,导致包含该.h的文件都引入了该命名空间. 2,各种容器 1)st

C++拾遗(四)——顺序容器

之前一篇博文(<初窥标准库>)简单了解了一种最常用的顺序容器:vector类型.本文将对该文内容进行进一步的学习和完善,继续讨论标准库提供的顺序容器类型.所谓顺序容器,即将单一类型的元素聚集起来成为容器,并根据位置来存储和访问这些元素.标准库定义了三种顺序容器类型:vector,list和deque(double-ended queue双端队列).同时还提供了三种顺序容器适配器(adaptor):stack,queue,priority_queue. 顺序容器 vector 支持快速随机访存