C++中的STL容器简介
来源:互联网 发布:笔记软件哪个好 编辑:程序博客网 时间:2024/05/21 04:20
http://blog.sina.com.cn/s/blog_725dd1010100upaj.html
STL -- Standard Template Library 标准模板库。
容器的概念
容器是指容纳特定类型对象的集合。根据数据在容器中排列的特性,容器可概分为序列式(sequence)和关联式(associative)两种。
迭代器是一种检查容器内元素并遍历元素的数据类型。它提供类似指针的功能,对容器的内容进行走访。
#include<iterator>
例如:
std::vector<int> IntVector;
std::vector<int>::iterator first=IntVector.begin();
// begin()得到指向vector开头的Iterator,*first得到开头一个元素的值
std::vector<int>::iterator last=IntVector.end();
// end()得到指向vector结尾的Iterator,*last得到最后一个元素的值
序列式容器
所谓序列式容器,其中的元素都可序(ordered),但未必有序(sorted)。数组为C++语言内置的序列容器,STL另外提供vector、list、deque(double-ended queue)。它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价。
标准库还提供了三种容器适配器(adapter),所谓适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。顺序容器适配器包括stack、queue、priority_queue等序列式容器。其中stack和queue由于只是将deque改头换面而成,技术上被归类为一种配接器(adapter),priority_queue是有优先级管理的队列。
一. Vector
1.vector的基本概念
vector是标准C++建议替代C数组的动态数组模型,它维护的是一个连续线性空间。
vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器start和finish分别指向配置得到的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
vector的实现技术,关键在于其对大小的控制以及重新分配时的数据移动效率。一旦vector原有空间用完,如果客户端每新增一个元素,vector内部就只扩充一个元素的空间,实为不智。因为所谓扩充控件(不论多大),是“配置新空间(malloc)/拷贝移动数据(memcpy)/释放旧空间(free)”的大工程,时间成本很高,应该采用某种未雨绸缪的空间配置策略。
注意,所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证之后尚有可供配置的空间),而是每次再分配原大小两倍的内存空间。因此,对vector的任何操作,一旦引起控件重新配置,指向原vector的所有迭代器就都失效了。
由于vector维护的是一个连续线性空间,因此vector迭代器具备普通指针的功能,支持随机存取,即vector提供的是Random Access Iterators。
2.向量类模板std::vector的成员函数
#include<vector>
std::vector<type> vec;
std::vector<type> vec(size);
std::vector<type> vec(size,value);
std::vector<type> vec(myvector);
std::vector<type> vec(first,last);
Operators:==、!=、<=、>=、<、>、[]
assign(first,last):用迭代器first,last所指定的元素取代向量元素
assign(num,val):用val的num份副本取代向量元素
at(n):等价于[]运算符,返回向量中位置n的元素,因其有越界检查,故比[]索引访问安全
front():返回向量中第一个元素的引用
back():返回向量中最后一个元素的引用
begin():返回向量中第一个元素的迭代器
end():返回向量中最后一个元素的下一个迭代器(仅作结束游标,不可解引用)
max_size():返回向量类型的最大容量(2^30-1=0x3FFFFFFF)
capacity():返回向量当前开辟的空间大小(<= max_size,与向量的动态内存分配策略相关)
size():返回向量中现有元素的个数(<=capacity)
clear():删除向量中所有元素
empty():如果向量为空,返回真
erase(start,end):删除迭代器start end所指定范围内的元素
erase(i):删除迭代器i所指向的元素
insert(i,x);把x插入到迭代器i所指定的位置之前
insert(i,n,x):把x的n份副本插入到迭代器i所指定的位置之前
insert(i,start,end):把迭代器start和end所指定的范围内的值插入到迭代器i所指定的位置之前
push_back(x):把x推入(插入)到向量的尾部
pop_back():弹出(删除)向量最后一个元素
rbegin():返回一个反向迭代器,该迭代器指向的元素越过了向量中的最后一个元素
rend():返回一个反向迭代器,该迭代器指向向量中第一个元素
reverse():反转元素顺序
resize(n,x):把向量的大小改为n,新元素的初值赋为x
swap(vectorref):交换2个向量的内容
3.动态字符串类std::string
string是标准C++建议替代C字符串(以零结束的字符数组)的动态字符串模型,可以简单的看做vector<char>。
#include<string>
std::string str1;
std::string str3(str2);
std::string str2("this is a string");
以下未列出与vector相同的通用操作。
Operators:+、+=
length():和size()函数功能相同
data():取得字符串指针
c_str():取得C风格字符串指针
c_str()的流程是先调用terminate(),然后再返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以/0的方式结束,最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,要使用c_str()函数。
operator=:赋值操作符
append():追加字符串
replace():替换字符
copy():拷贝自己的num个字符到str中(从索引index开始)。
find():在字符串中查找指定字符,返回基于0的索引号
rfind():反向查找
find_first_of():查找包含子串中的任何字符,返回第一个位置
find_first_not_of():查找不包含子串中的任何字符,返回第一个位置
find_last_of():查找包含子串中的任何字符,返回最后一个位置
find_last_not_of():查找不包含子串中的任何字符,返回最后一个位置
substr(n1,len):得到字符串从n1开始的长度为len的子串
比较字符串(支持所有的关系运算符)
compare 比较字符串
operator+
operator+= 增加操作符
operator== 判断是否相等
operator!= 判断是否不等于
operator< 判断是否小于
operator>> 从输入流中读入字符串
operator<< 字符串写入输出流
getline 从输入流中读入一行
二.list
1.list的基本概念
相对于vector的连续线性空间,list就显得复杂许多,与向量(vector)相比, 它允许快速的插入和删除,且每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。
list不再能够像vector那样以普通指针作为迭代器,因为其节点不保证在储存空间中连续存在。list迭代器必须有能力指向list的节点,并有能力进行正确的递增、递减、取值、成员存取等操作。所谓“list迭代器正确的递增、递减、取值、成员取用”操作是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值,成员取用时取用的是节点的成员。
list不仅是一个双向链表,而其还是一个环状双向链表。所以它只需要一个指针,便可以完整实现整个链表。由于list是一个双向链表(double linked-list),迭代器必须具备前移、后移的能力,所以list提供的是Bidirectional Iterators。
list有一个重要性质:插入操作(insert)和合并操作(splice)都不会造成原有的list迭代器失效。这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。甚至list的元素删除操作(erase)也只有“指向被删除元素”的那个迭代器失效,其他迭代器不受任何影响。
2.链表类模板std::list成员函数
#include<list>
std::list<type> lst;
std::list<type> lst(size);
std::list<type> lst(size,value);
std::list<type> lst(mylist);
std::list<type> lst(first,last);
以下未列出与vector相同的通用操作。
push_front(x):把元素x推入(插入)到链表头部
pop_front():弹出(删除)链表首元素
merge(listref):把listref所引用的链表中的所有元素插入到链表中,可指定合并规则
splice():把lst连接到pos的位置
remove(val):删除链表中所有值为val的元素
remove_if(pred):删除链表中谓词pred为真的元素
(谓词即为元素存储和检索的描述,如std::less<>,std::greater<>那么就按降序/升序排列,你也可以定义自己的谓词)
sort():根据默认的谓词对链表排序
sort(pred):根据给定的谓词对链表排序
unique():删除链表中所有重复的元素
unique(pred):根据谓词pred删除所有重复的元素,使链表中没有重复元素
注意:vector和deque支持随机访问,而list不支持随机访问,因此不支持[]访问!
- C++STL容器简介
- C++STL中的容器
- 【学习C++】标准C++中的STL容器类简介
- C++中的STL容器简介
- C++中的STL容器简介
- C++ STL中的容器简介
- 标准C++中的STL容器类简介
- 标准C++中的STL容器类简介
- 标准C++中的STL容器类简介
- C模板实现STL容器中的vector
- C++STL中的set容器和map容器
- STL容器类简介
- STL容器简介
- STL容器简介
- STL容器简介
- STL主要容器简介
- STL 容器简介
- STL容器 初步简介
- C++ 容器及选用总结
- 第四章、安装 CentOS 5.x 与多重开机小技巧
- 记录:LED灯驱动
- Android权限配置
- 第五章、首次登陆与在线求助 man page
- C++中的STL容器简介
- UVa 624 - CD DP 0/1 背包问题
- 毁灭感情的不是距离,而是怀疑
- c++ 容器类 概括性介绍
- 第六章、Linux 的文件权限与目录配置
- 安卓转屏实现4个方向+变换坐标原点位置
- Android4.x中ScrollView嵌套ListView,ListView不能完全显示总结、解决办法
- 第七章、Linux 文件与目录管理
- 在线英文写作辅助工具