C++顺序容器 操作归纳

1. 泛型算法(通过迭代器来间接操作容器)

标准库的容器操作 很少,标准库虽然没有给每个容器 添加很多功能,但是提供了一组算法。

算法是独立于容器的、通用的(同一个算法,可用于不同类型的容器、不同类型的元素)

例如 find算法

find ( vec.begin() , vec.end() , val ) 在容器vec中,查找val元素

2. 迭代器(访问容器对象 元素)

在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂。

所有标准库容器都支持迭代器

和指针 相同点和指针 不同点
都支持运算符移动指针:取地址&返回 迭代器:通过成员函数 begin()、end() 返回
指针:指向 内存单元 迭代器:指向 容器中元素
都通过 解引用 *iter 获取指向的元素

迭代器类型

标准库类型,用 iteratorconst_iterator 表示迭代器类型:

vector<int>:: iterator it; // 读写迭代器

string:: iterator it;

vector<int>:: const_iterator it; // 只读 迭代器

string:: const_iterator it;

迭代器运算符

*iter返回迭代器iter所指元素的引用
iter -> member解引用iter 并获取该元素的成员member
++iter令迭代器指向 容器的下一个元素
--iter令迭代器指向 容器的上一个元素
iter1 == iter2判断两个迭代器是否相等
iter1 != iter2

3. 容器

------------所有容器------------

容器构造、初始化

操作说明不支持容器
C<T> c1;默认构造函数
C<T> c1(c2); C<T> c1 = c2;c1初始化为c2的拷贝(必须是相同类型)
C<T> c {a, b, c}; C<T> c = {a, b, c};初始化列表
C<T> c(b, e);迭代器b、e范围元素内的拷贝
C<T> seq(n); 接收大小参数顺序容器对象seq 包含n个元素仅顺序容器(array除外)
C<T> seq(n,val);接收大小参数顺序容器对象seq 包含n个值为val元素仅顺序容器(array除外)

赋值

赋值适用于所有容器,赋值后 两者大小 都为 右边容器的大小。

操作说明不支持容器
c1 = c2;
c = {a, b, c ……}array

swap 交换元素

操作说明不支持容器
swap(c1,c2)
c1.swap(c2)array

替换(仅顺序容器)

操作说明不支持容器
seq.assign(b, e)将顺序容器seq的元素,替换为,迭代器b、e范围内的元素关联容器、array
seq.assign(i1)替换为 初始化列表i1的元素关联容器、array
seq.assign(n, val)替换为n个val的元素关联容器、array

容器大小 size()

每个容器类型,都有3个与大小有关的操作

操作说明不支持容器
c.size()元素数目forward_list
c.max_size()可保存的最大元素数目
c.empty()是否空容器。返回ture、false

迭代器获取

操作说明不支持容器
c.begin() c.end()指向c首、尾元素之后位置的迭代器
c.cbegin() c.cend()const_iterator
c.rbegin() c.rend()指向c尾元素、首元素之前位置的迭代器
c.crbegin() c.crend()const_reverse_iterator

------------顺序容器--------------

所有顺序容器,都支持 顺序访问元素 (≠ 随机访问)

顺序容器,几乎可以保存 任意类型的 元素,元素类型是容器类型 也可以

选取原则

  • 默认选择—— vector

  • 快速随机访问—— vector、deque

  • 中间 插入、删除元素—— list、forward_list

  • 头尾不在 中间 插入、删除元素 —— deque

1. vector(可变数组)

元素保存在连续的 内存空间,连续存储

支持缺点
快速随机访问中间位置 插入、删除 元素 非常耗时,需要移动位置之后所有元素, 可能还要分配额外的存储空间(每个元素移动到新的存储空间)
快速在尾部插入、删除元素

2. deque(双端队列)

支持缺点
快速随机访问中间位置 插入、删除 元素非常耗时
快速在头部、尾部插入、删除元素

####

3. list(双向链表)

优点缺点
双向 顺序访问不支持元素 随机访问,访问1个元素只能遍历整个容器
任何位置 插入、删除 很快额外内存开销大

####

4. forward_list(单向链表)

优点缺点
单向 顺序访问不支持元素 随机访问,访问1个元素只能遍历整个容器
任何位置 插入、删除 很快额外内存开销大

####

5. array(固定数组大小)

优点缺点
快速随机访问不能 插入、删除元素(array大小固定)
不能 改变容器大小

####

6. string (类似vector)

元素保存在连续的 内存空间

支持缺点
快速随机访问中间位置 插入、删除非常耗时,需要移动位置之后所有元素, 可能还要分配额外的存储空间(每个元素移动到新的存储空间)
快速在 尾部 插入、删除元素

string额外操作

构造

专有操作说明
string s1(cp,n)cp指向数组中 前n个字符的拷贝
string s1(s2,pos2)s2从下标pos开始的字符拷贝
string s1(s2,pos2,len2)s2从下标pos开始的,len个字符的拷贝

substr操作

专有操作说明
s.substr(pos,n)s中从pos开始的n个字符的拷贝。 pos默认为0

插入、删除、替换、追加

专有操作说明
s.insert(pos,args)在pos之前,插入args指定的字符
s.erase(pos,len)删除从pos开始的len个字符 如果len省略,则删除到末尾
s.assign(args)替换为args指定的字符
s.append(args)将args追加到s末尾
s.replace(range,args)删除s中范围range内的字符,替换为args指定的字符

搜索

专有操作说明
s.find(args) s.rfind(args)查找s中args第一次出现的位置 查找s中args最后一次出现的位置
s.find_first_of(args) s.find_last_of(args)在s中查找 args中任何一个字符 第一次出现的位置 在s中查找 args中任何一个字符 最后一次出现的位置
s.find_first_not_of(args) s.find_last_not_of(args)

顺序容器 共同操作

添加元素(array不支持)

操作说明不支持容器
c.push_back(t) c.emplace_back(args)在c的尾部 添加一个元素(值为t 、参数args),返回voidarray、forward_list
c.push_front(t) c.emplace_front(args)在c的头部 添加一个元素(值为t 、参数args),返回voidstring、array、vector
c.insert(p, t) c.emplace(p, args)迭代器p指向元素,之前位置插入值为t 元素,返回指向新添加元素的迭代器array、forward_list专有、
c.insert(p, n , t)迭代器p指向元素,之前位置插入n个元素,返回指向新添加元素的迭代器array、
c.insert(p, b , e)迭代器p、e指定范围内的元素,添加到迭代器p指向的元素之前array、
c.insert(p, i1)i1:花括号包围的元素列表。将i1的值添加到迭代器p指向元素之前array、

删除元素(array不支持)

操作说明不支持容器
c.pop_back(t)删除c尾元素array、forward_list
c.pop_front()array、vector、string
c.erase(p)删除迭代器p指向的元素,返回指向被删元素之后的元素的迭代器,array、forward_list专有
c.erase(b,e)删除迭代器b、e指定范围内的元素,返回指向最后1个被删元素之后的元素的迭代器array、
c.clear()删除所有元素array、

访问元素

操作说明不支持容器
c.back(t)返回c尾元素的引用forward_list
c.front()返回c首元素的引用
c[n] 下标运算符返回c中下标为n的引用
c.at(n)返回c中下标为n的引用list、forward_list

改变容器大小(array不支持)

已经保存的元素个数(允许有剩余空间)

操作说明不支持容器
c.resize(n)调整c的大小为n个元素。若n < c.size(),多出元素丢弃。array、
c.resize(n,t)调整c的大小为n个元素。新添加的元素初始化值为 tarray、

管理容器大小(仅vector、string、deque)

操作说明仅支持容器
c.shrink_to_fit()让capacity()减少,== size()vector、string、deque
c.capacity()不重新分配内存,最多可以保存多少元素vector、string
c.reserve()分配至少能 容纳n个元素的内存空间vector、string

关系运算(= != > >= < <= )

实质:元素的逐对比较

操作说明不支持容器
= !=(相等运算符)大小相同、所有元素两两对应
> >= < <=无序关联容器

------------关联容器------------

待补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值