STL主要包含了容器、迭代器、算法和string四部分。
标准库算法对迭代器而不是容器进行操作。因此,算法不能(直接)添加或删除元素。
一、容器
容器为存储和管理数据对象的集合,包含了三种容器:
1.线性容器:该类容器的逻辑结构为线性结构。可以通过下标访问元素的容器称为随机容器,其特点是容器中的元素在内存中是连续存放的,容器的存储结构为顺序存储结构。vector和deque为随机容器。
2.适配器容器:以线性容器作为底层容器,且对线性容器的通用接口加以限制。默认的底层容器为双端队列。只要满足上层容器对接口的要求,也可以用自己定义的容器类型作为适配器容器的底层容器。
3.关联容器:其存储结构为平衡树,基于红黑树实现。
容器的创建 :
//模板类创建
vector<int>a; //定义了一个vector类型的变量,其中元素为整型
//用户自定义类型的容器变量
struct node{
int key;
int data;
};
vector<node>b;
注意:用户自定义的类型不适用于容器priority_queue、map、multimap、set、multiset
的类型参数,因为这类容器需要根据元素值的大小来决定存放位置。因此,创建这类容器时,
需定义元素之间的比较准则,确保元素之间可以进行比较。
因此,若用户自定义类型为整形、字符型等基本数据类型,也适用于以上容器;
若容器元素类型为用户自定义类型,则必须指定自定义类型变量之间的比较方法。
//第一种方法:基于运算符的比较方法
//包含小于运算符重载的类型定义
struct node{
int key;
int data;
bool operator<(const node &n1)const{
return key<n1.key;
}
};
set<node>se;
//第二种方法:基于比较器的比较方法
//即定义对函数调用进行重载的结构,并在创建对象时将该结构名作为参数
struct cmp{
bool oprator()(node n1,node n2){
return n1.key<n2.key;
}
};
set<node,cmp>se;
容器的基本操作:
size()
empty()
insert()
erase()
clear()
begin()
end()
pair类型:
pair类型的变量将一对值组合成一个整体(相当于一个含有两个元素的结构),这一对值可以具有不同的数据类型,可以用pair的;两个公有属性first和second访问这两个值。
pair<int,string>p(1,"hahaha"); //在定义时初始化
p=make_pair(2,"abc"); //改变pair变量的值
cout<<p.first<<" "<<p.seconnd<<endl; //输出pair中的两个元素
vector<pair<int,int>>vp; //pair作为其他容器的类型参数
vp.push_back(make_pair(2,4));
cout<<vp[0].first<<" "<<vp[0].second<<endl;
二、迭代器
迭代器可以访问容器(适配器容器除外)的元素,迭代器和容器的关系类似于指针和数组的关系。迭代器和指针之间的一个重要区别就是不存在NULL的迭代器。
//迭代器的定义方式:
//容器类型::iterator it
vector<int>::iterator it;
//向前/后移动
it--;
it++;
//随机迭代器如vector和deque,可以采用加上或减去一个整数的方式向后/向前移动
it = it+2;
//非随机容器的迭代器只能采用“++”或“--”移动
//举例:遍历容器所有元素
for(vector<int>::iterator it=a.begin();it!=a.end();it++)
cout<<*it<<end;
三、算法
string用法
//头文件
#include<string>
//初始化
string s1;
string s2("hello world!");
string s3="hello china!";
//赋值与比较
if(s2>s3) cout<<s2<<endl; //两个字符串比较,另外可以使用比较运算符
else cout<<s3<<endl;
//连接、插入与删除
//可以利用加号运算符或append函数将两个字符串连接在一起
//插入字符串可以使用insert函数;
//删除字符或子串可以使用erase函数。
s1 = s2+s3+"OK!";
s1+=s2;
s1.append(s2);
s1.insert(5,"abc"); //在s1的第五个位置出添加字符串
s1.erase(5,7) //删除s1中5-7位置的字符
//补充与拓展
//可以通过substr函数求一个字符串的子串
//可以通过find函数查找是否存在某个字符或字符串
cout<<s1.substr(3)<<endl; //得到s1从位置3开始后面的所有字符促成的子串
cout<<s1.substr(3,5)<<endl; //得到s1从位置3开始的5个字符所组成的子串
cout<<(signed)s1.find("l")<<endl; //查找s1中是否含有l字符,存在返回第一个“l”的下标,否则返回-1
cout<<(signed)s1.find("hi")<<endl;
cout<<(signed)s1.find("hi",3)<<endl; //从s1[3]后开始查找是否存在字符串“hi”
cout<<(signed)s1.find("l")<<endl; //在s1的下标区间[3,10)范围内查找是否存在字符串“hi”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)