STL简介

本文详细介绍了C++ STL库的核心组成部分,包括线性容器、适配器容器和关联容器的使用,迭代器的概念与操作,以及string的常用函数。重点讲解了如何创建和操作容器,以及如何通过标准库算法对数据进行处理,如迭代器的应用和字符串操作技巧。

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”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的小羽儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值