浅谈C++标准库

C++模板

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码

模板是创建泛型类或函数的蓝图或公式

可以使用模板来定义函数和类

//函数模板
template  ret-type func-name(parameter list)
{
   // 函数的主体
}

//类模板
template  class class-name {
.
.
}

C++标准库

①标准函数库--继承自C语言

​ I/O;字符串和字符处理;数学;时间、日期和本地化;动态分配;其他;宽字符函数

②面向对象类库--类及相关函数的集合

​ C++ I/O;String类;数值类;STL容器类;STL算法;STL函数对象;STL迭代器;STL分配器;本地化库;异常处理类;杂项支持库

C++ 面向对象类库

string

可以使用下标和迭代器访问

string s1; //初始化字符串,空字符串,可变长
string s2 = "I am wenny"; //直接初始化
string s3 = string(6,'c'); //拷贝初始化
//cin>>s1;  //遇到空白停止读取
cout< 
 

标准模板库

--实现多种流行和常用的算法和数据结构

浅谈C++标准库_第1张图片

帮助文件:c++API.chm(最后整理于2/26/2006)

​ cppreference-zh-20210212.chm

浅谈C++标准库_第2张图片

template 
inline void showset(set v){
    for(typename set::iterator it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";
    cout< 
 

vector

翻译为向量--”变长数组“;可以不用初始化就必须指定大小的数组

可以通过下标和迭代器访问

常见用途:1.储存数据:元素个数不确定时 2.用邻接表存储图

//初始化
vector v1;
vector> v2;  //相当于变长二维数组
vector v[100]; //相当于二维数组,第一维已经固定长度
vector v3={1,2,3,4};
vector v4(3,"hi");
vector v5(4);  //默认初始化为0,字符串默认为空
//操作
v1.push_back(2); //向末尾添加对对象,时间复杂度O(1)
v1.pop_back(); //删除尾部的对象,时间复杂度O(1)
v1.empty(); //返回bool值
v3.size();  //返回vector种元素的个数,时间复杂度O(1)
v1.clear(); //删除所有元素,时间复杂度O(n)
v1.insert(v1.begin(),3); //插入一个或多个元素,时间复杂度O(n)
v1.erase(v1.begin());  //删除一个或多个元素,时间复杂度O(n)
v1=v3;
//使用了迭代器的循环体,不要向迭代器所属容器添加元素
cout< 
 

set

翻译为集合

与vector大致相同,但set中的元素有序且唯一;添加元素时自动排序,元素本来存在则动作不执行

只能通过迭代器访问

常见用途:需要去重却不方便直接开数组

set s1={9,8,7,6,5,4};  //从小到大自动排序
showset(s1);
//cout< s2={"hello","world","apple"};  //字典序排序
showset(s2);
    
s1.insert(9);  //已存在没有插入动作,时间复杂度O(logn)
showset(s1);
s2.insert("banana"); //添加并排序
showset(s2);

set::iterator it s1.find(2); //返回value对应的迭代器,时间复杂度O(logn)
s1.erase(); //参数是迭代器,时间复杂度为O(1);参数是value,时间复杂度是O(logn)

list

双向链表

list l1={6,7,3,4};
showlist(l1);
list l2(5,'a');
showlist(l2);

l1.sort(); //list自己的排序函数,无参数
showlist(l1);

map

翻译为映射

运用了hash地址映射的思想,即key-value;

将一个类型的变量映射至另一类型;

map的内部实现是一棵红黑树

可以通过下标和迭代器访问

常见用途:建立字符串与整数之间的映射;判断大整数或其它类型数据是否存在的题目,可以把map当bool数组用;

void showmap(map v){
    for(map::iterator it=v.begin();it!=v.end();it++)
        cout<first<<" "<second< m1;  //第一个参数是key,第二个参数是value
    m1["jojo"]=100;
    m1["kiki"]=99; //会以键从小到大的顺序自动排序

    cout<("harr",89));  //增加元素
    showmap(m1);
    m1.clear();  //清空元素
    m1.find(b);  //确定map中是否有string对象b的映射,若没有函数返回m1.end();时间复杂度O(logn)
    return 0;

}

queue

翻译为队列,实现先进先出

常见用途:实现广度优先搜索

queue q1;
q1.front(); //因为是限制性数据结构,只能通过front()来访问队首元素,back()来访问队尾元素
q1.back();
q1.push(1);
q1.pop();
q1.empty();
q1.size();

priority_queue

优先队列,底层用堆实现;队首元素一定是优先级最高的那个

常见用途:贪心问题;对dijkstra算法进行优化

priority_queue,greater> q;  //从大到小排序,数字越小优先级越大
priority_queue,less> q2;  //从小到大排序,数字越大优先级越大;默认
q.push(3);  //入队,时间复杂度O(logn)
q.push(2);  
q.push(4);
cout<b.price;
	}
};
priority_queue q3; //按照重载的运算符<排序
fru f1,f2,f3;
f1.name = "peach";
f1.price = 3;
f2.name = "apple";
f2.price = 1;
q3.push(f1);
q3.push(f2);
cout<b.price;
	}
};
priority_queue,cmp> q4; //重写排序规则
q4.push(f1);
q4.push(f2);
cout< 
 

stack

栈,后进先出

常见用途:模拟实现一些递归

stack s;
s.push(1);  //入栈,时间复杂度O(1)
s.push(2);
s.push(3);
s.pop();  //出栈,时间复杂度O(1)
cout< 
 

pair

可以看作一个内部有两个元素的结构体

常见用途:用来代替二元结构及其构造函数,节省编码时间;作为map的键值对进行插入

struct pair{
	typename first;
	typename second;
};
pair p;
p.first = "haha";
p.second = 5;
p = make_pair("xixi",55);  //临时构建一个pair
p = pair("heihei",555);  //临时构建一个pair
cout<<(p1>=p2);  //可以直接使用比较操作数

algorithm下的常用函数

int x=-1,y=2;
double a=0.1,b=0.2;
max(x,y);  //参数只能是两个
min(a,b);
abs(x);  //x必须是整数
swap(x,y);  //交换x和y的值
int c[3]={1,2,3};
reverse(c,c+3);  //将数组指针在[it,it2)之间的元素或容器的迭代器在[it,it2)范围内的元素进行反转
int d[10]={1,2,3};
do{
    cout< 
 

到此这篇关于浅谈C++标准库的文章就介绍到这了,更多相关C++标准库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(浅谈C++标准库)