C++标准模板库(STL)

STL分为vector、set、string、map、queue、priority_queue、stack、pair

  • vector翻译为向量,但在C++这里使用叫“变长数组(长度根据需要而自动改变的数组)”更合适。

1.定义:
vector<typename> name; //typename可以是 int、double、char 或者是结构体类型
如果typename也是一个STL容器,定义的时候在两个**>**之间加空格
例如:vector<vector<int> >name;
定义vector数组:

vector<typename> Arrayname[arraysize];

2.vector容器内元素的访问方式
a.通过下标访问:和访问普通数组一样
例如:
定义 :
vector<typename> vi
vi[index] //(如:vi[0]、vi[1])

b.通过迭代器访问:迭代器(iterator)类似于指针

vector<typename>::iterator it;
 vector<int> vi;     //定义一个int型的容器
 for(int i = 0;i < 5;i++)
 vi.push_back(i);       //在vi的末尾添加元素i
 vector<int>::iterator it = vi.begin();  //vi.begin()为取vi的首元素地址,it指向这个地址
 for(int i = 0;i < 5;i++)
 printf("%d ",*(it+i));    //输出vi[i] = *(vi.begin()+i)
 //迭代器实现自加 ,vector的迭代器不支持it < vi.end()写法,所以循环只能写为it != vi.end(),vi.end()是取尾元素地址的下一个地址
 for(vector<int>::iterator it = vi.begin();it != vi.end();it++)
 printf("%d ",*it);  

3.vector的基本操作

push_back(x); //在vector后面添加一个元素x
pop_back();  //删除vector的尾元素
size();//获取vector中元素的个数
clear();//清空vector中的所有元素
insert(it,x);//向vector的任意迭代器it处插入一个元素x
erase(it);//删除迭代器为it处的元素
erase(first,last);//删除区间[first,last)内的所有元素
  • set翻译为集合,是一个内部自动有序且不含重复元素的容器。

1.定义:

set<typename> name; 

set的定义和vector的定义一样,只需把vector改为set就行

2.set容器内元素的访问
set容器的访问只能通过迭代器访问,和vector差不多。
除了 vector和string之外的STL容器都**不支持(it+i)*的访问方式,所以只能以自加的方式进行枚举。

 set<int> vi;
 for(set<int>::iterator it = vi.begin();it != vi.end();it++)
 printf("%d ",*it);  

3.set的基本操作
insert(x)将x插入set容器中,并自动递增排序和去除重复的元素
find(value)返回set中对应值为value的迭代器
erase(it)删除迭代器为it处的元素
erase(first,last)删除区间[first,last)内的所有元素
size()获取set中元素的个数
clear()清空set中的所有元素

  • string

1.定义:和定义普通类型一样

string str;
//对变量进行初始化
string str = "abcd";

2.string中内容的访问
a.通过下标访问:和访问普通字符串数组一样

string str = "abcd";
for(int i = 0;i < str.length();i++)
printf("%c",str[i]);

b.通过迭代器访问
迭代器定义(与其他迭代器不同):string::iterator it;
vector和string之外的STL容器都支持*(it+i)的访问方式,也能以自加的方式进行枚举。

3.基本操作
+= 字符串拼接

 length()/size();//返回string的长度,即存放的字符数。
 insert(pos,string);//在pos号位置插入字符串string
 insert(it,it2,it3);//it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器

如:

string str = "abcxyz",str2 = "opq";
 str.insert(str.begin()+3,str2.begin(),str2.end());
substr(pos,len);//返回从pos号位开始,长度为len的字串

string::npos是一个常数,本身值为-1,但由于是unsigned_int型也可以认为是unsigned_int类型的最大值,用于find函数失配时的返回值

str.find(str2);//当str2是str的字串时,返回其在str中第一次出现的位置,如果不是就返回string::npos。
str.find(str2,pos);//从str的pos号位开始匹配str2,返回值与上相同
str.replace(pos,len,str2);//把str从pos号位开始、长度为len的字串替换为str2.
str.replace(it1,it2,str2);//把str的迭代器[it1,it2)范围的字串替换为str2.
  • map翻译为映射

1.定义:
map<typename1,typename2> mp;
typename1为映射前类型(键key)
typename2为映射后类型(值value)
如果是字符串映射。必须使用string而不能使用char数组

map<string,int> mp;

map的键和值可以是STL容器

map<set<int>,string> mp;

2.map容器内元素的访问方式
**a.通过下标访问:**和访问普通数组一样
如:

map<char,int> mp;
mp['c'] = 20;
mp['c'] = 30;          //20被覆盖,因为键值是唯一的
printf("%d\n",mp['c']); //打印出30

b.通过迭代器访问:

map<typename1,typename2>::iterator mp;
   map<char,int> mp;
    mp['m'] = 20;
    mp['r'] = 30;      
    mp['a'] = 40;
   for(map<char,int>::iterator it = mp.begin();it != mp.end();it++)
   {
       printf("%c %d\n",it->first,it->second);
   }
  // map会以键从小到大的顺序自动排序

3.基本操作

find(key);//返回键为key的映射的迭代器
 size();//获取vector中元素的个数
clear();//清空vector中的所有元素
erase(it);//删除迭代器为it处的元素
erase(first,last);//删除区间[first,last)内的所有元素
  • queue队列

1.定义

queue<typename> name;

2.访问
只能通过front()来访问队首元素,通过back()访问队尾元素

queue<int > q;
printf("%d %d",q.front(),q.back());

3.基本操作

push(x);//将x进行入队

front()或back()分别获得队首元素和队尾元素

pop();//令队首元素出队
empty();//判断queue是否为空
size();//返回queue内元素的个数

队列分为双端队列(dequeue)和优先队列(priority_queue)前者是首尾皆可插入和删除的队列,后者是使用堆实现的默认将当前队列最大元素置于队首的容器。

  • priority_queue称为优先队列,底层用堆来实现。队首元素一定是当前队列中优先级最高的那一个。

1.定义

priority_queue<typename> name;

2.访问

优先队列没有front()和back()函数,只能通过top()函数来访问队首元素(堆顶元素)

3.基本操作

push(x);//将x进行入队
top();//获取队首元素
pop();//令队首元素出队
empty();//判断优先队列是否为空
size();//返回queue内元素的个数

4.priority_queue内元素优先级的设置
a.基本数据类型的优先级设置

priority_queue<int> q;
priority_queue<int,vector<int>,less<int> > q;//第三个参数表示数字大的优先级越大,如果换成greater<int>表示数字小的优先级越大,第二个参数表示承载底层数据结构堆的容器

b.结构体的优先级设置

struct fruit{
    string name;
    int price;
    friend bool operator < (fruit f1,fruit f2) //重载大于号会编译错误 
    {
        return f1.price > f2.price;
     }
};
  • stack栈

1.定义

stack<typename > name;

2.容器内元素的访问

由于栈本身就是一种后进先出的数据结构,只能通过top()函数来访问栈顶元素

3.基本操作

push(x);//将x进行入栈
top();//获取栈顶元素
pop();//令栈顶元素出队
empty();//判断栈是否为空
size();//返回栈内元素的个数
  • pair可以看作是内部有两个元素的结构体

    struct pair {
    typename1 first;
    typename2 second;
    };

1.定义

pair<typename1,typename2> name;

如果想在代码中临时构建一个pair,有如下两种方法:

  1. 将类型定义写在前面,后面小括号内两个元素的方式:
   pair<string,int>("haha",5);
  1. 使用自带的make_pair函数
make_pair("haha",5);

2.访问
pair中只有两个元素,分别是first和second,按正常访问结构体的方式访问它即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值