返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅谈C++标准库
  • 247
分享到

浅谈C++标准库

2024-04-02 19:04:59 247人浏览 安东尼
摘要

目录c++模板 C++标准库 C++ 面向对象类库 string 标准模板库 vector setlist map queue priority_queue stack pair a

C++模板

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

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

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


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

//类模板
template <class type> 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<<s2;
str.c_str(); //将string型str使用c_str()变为字符数组,可以使用printf进行输出
cout<<s2[0];  //可以使用下标引用
s2=s1;  //用s1代替s2
s1=s1+s2;  //连接s1和s2

getline(cin,s3); //获取有空白符的一整行内容,按回车键结束输入,不能输入字符数组;输入遗留在输入缓冲的换行符消除
getline(cin,s3,'#')  //输入一串字符(无论多少个回车键),只要是在‘#'之前的字符都会读取并保存
s3.erase(10,8);  //删除s3[10]开始的8个字符,时间复杂度O(n)
s3.insert(2,"bbb"); //在s3中下标为2的字符前插入字符串,时间复杂度O(n)
s3.insert(it,it2,it3);  //迭代器,表示串[it2,it3)将被插入在it的位置

cout<<s2.find("am",0);  //返回子串位置,第二个参数是查找起始位置,如果没有找到返回string::npos;时间复杂度O(nm),n和m分别为str和str2的长度
s2.empty();
s2.size();
s2.substr(pos,len); //从pos号位开始,长度为len的子串,时间复杂度O(len)
s2.replace(pos,len,str2);  //从pos号为开始、长度为len的子串替换为str2;时间复杂度O(str.length())

标准模板库

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

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

​ cppreference-zh-20210212.chm


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

vector

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

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

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


//初始化
vector<int> v1;
vector<vector<int>> v2;  //相当于变长二维数组
vector<int> v[100]; //相当于二维数组,第一维已经固定长度
vector<int> v3={1,2,3,4};
vector<string> v4(3,"hi");
vector<int> 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<<v1[0]; //返回v种第0个位置上元素的引用
cout<<(v1==v5);  //相等当且仅当元素数量相同且对应位置的元素值都相同

set

翻译为集合

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

只能通过迭代器访问

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


set<int> s1={9,8,7,6,5,4};  //从小到大自动排序
showset(s1);
//cout<<s1[1]; //不能使用下标引用

set<string> s2={"hello","world","apple"};  //字典序排序
showset(s2);
    
s1.insert(9);  //已存在没有插入动作,时间复杂度O(logn)
showset(s1);
s2.insert("banana"); //添加并排序
showset(s2);

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

list

双向链表


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

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

map

翻译为映射

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

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

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

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

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


void showmap(map<string,int> v){
    for(map<string,int>::iterator it=v.begin();it!=v.end();it++)
        cout<<it->first<<" "<<it->second<<endl;  //first表示key,second表示value
    cout<<endl;
}

int main()
{
    map<string,int> m1;  //第一个参数是key,第二个参数是value
    m1["jojo"]=100;
    m1["kiki"]=99; //会以键从小到大的顺序自动排序

    cout<<m1["jojo"]<<endl;  
    cout<<m1.count("wenny"); //判断是否存在key,返回1或0
    cout<<m1["test"]<<endl; //不存在key,则显示0,但会插入到map中
    
    showmap(m1);
    m1.erase("kiki");  //通过关键字删除元素,时间复杂度O(logn);直接删除迭代器时间复杂度O(1)
    showmap(m1);
    m1.insert(pair<string,int>("harr",89));  //增加元素
    showmap(m1);
    m1.clear();  //清空元素
    m1.find(b);  //确定map中是否有string对象b的映射,若没有函数返回m1.end();时间复杂度O(logn)
    return 0;

}

queue

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

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


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

priority_queue

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

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


priority_queue<int,vector<int>,greater<int>> q;  //从大到小排序,数字越小优先级越大
priority_queue<int,vector<int>,less<int>> q2;  //从小到大排序,数字越大优先级越大;默认
q.push(3);  //入队,时间复杂度O(logn)
q.push(2);  
q.push(4);
cout<<q.top();  //获得队首元素,即堆顶元素
q.pop();  //出队,时间复杂度O(logn)
cout<<q.top();
cout<<q.empty();
struct fru{
	string name;
	int price;
	bool operator < (const fru &b) const{
		return price>b.price;
	}
};
priority_queue<fru> q3; //按照重载的运算符<排序
fru f1,f2,f3;
f1.name = "peach";
f1.price = 3;
f2.name = "apple";
f2.price = 1;
q3.push(f1);
q3.push(f2);
cout<<endl<<q3.top().name<<" "<<q3.top().price;
struct cmp{
	bool operator () (const fru &a,const fru &b){
		return a.price>b.price;
	}
};
priority_queue<fru,vector<fru>,cmp> q4; //重写排序规则
q4.push(f1);
q4.push(f2);
cout<<endl<<q4.top().name<<" "<<q4.top().price;

stack

栈,后进先出

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


stack<int> s;
s.push(1);  //入栈,时间复杂度O(1)
s.push(2);
s.push(3);
s.pop();  //出栈,时间复杂度O(1)
cout<<s.top()<<endl;  //获得栈顶元素,时间复杂度O(1)
cout<<s.empty()<<endl;
cout<<s.size()<<endl;

pair

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

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


struct pair{
	typename first;
	typename second;
};
pair<string,int> p;
p.first = "haha";
p.second = 5;
p = make_pair("xixi",55);  //临时构建一个pair
p = pair<string,int>("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<<a[0]<<a[1]<<a[2]<<endl;
}while(next_permutation(d,d+3));  //函数给出一个序列在全排列中的下一个序列,到达全排列最后一个时会返回false
fill(d,d+2,5);  //把数组或容器的[it,it2)赋为某个相同的值
sort(d,d+3);  //默认递增排序
//用在有序数组或容器中;时间复杂度O(log(last-first));返回位置的指针或迭代器
lower_bound(d,d+3,2);  //寻找第一个大于等于val的元素位置
upper_bound(d,d+3,2);  //寻找第一个大于val的元素位置

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

--结束END--

本文标题: 浅谈C++标准库

本文链接: https://lsjlt.com/news/132949.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈C++标准库
    目录C++模板 C++标准库 C++ 面向对象类库 string 标准模板库 vector setlist map queue priority_queue stack pair a...
    99+
    2024-04-02
  • 如何浅谈进行URL标准化的必要性
    这期内容当中小编将会给大家带来有关如何浅谈进行URL标准化的必要性,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。现在互联网越来越讲究规范化,网站的URL标准化(URL c...
    99+
    2024-04-02
  • 浅谈C++流库的基本结构
    目录一、流库的基本结构二、流库常用API流库是C++标准库的一部分,它提供了一组与输入和输出流相关的类和函数,使得数据的读写变得非常方便和灵活。下面我们将介绍C++流库的基本结构及其...
    99+
    2023-05-16
    C++流库 C++流库基本结构
  • 从c++标准库指针萃取器谈一下traits技法(推荐)
    本篇文章基于gcc中标准库源码剖析一下标准库中的模板类pointer_traits,并且以此为例理解一下traits技法。 说明一下,我用的是gcc7.1.0编译器,标准库源代码也是...
    99+
    2024-04-02
  • C++超详细讲解标准库
    目录一、有趣的重载二、C++ 标准库三、小结一、有趣的重载 操作符 << 的原生意义是按位左移,例:1 <<2; 其意义是将整数 1 按位左移2位,即:000...
    99+
    2024-04-02
  • C++标准库难点有哪些
    本篇内容主要讲解“C++标准库难点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++标准库难点有哪些”吧!在C++标准库中,有关缺省变量值的限制非常模糊。基于此,很多编译器允许开发人员将...
    99+
    2023-06-17
  • C++标准库STL容器详解
    目录 C++标准模板库STL容器容器分类容器通用接口 顺序容器vectorlistdeque 容器适配器queuestackpriority_queue 关联容器:红黑树setmultisetmapmultimap ...
    99+
    2023-08-30
    c++ 服务器 数据结构 算法 linux 网络
  • 浅谈C#数组(一)
    目录一.简单数组之一维数组   1.数组的声明   2.数组的初始化3.访问数组元素4.数组中使用引用类型二.多维数组三.锯齿数组四.Array类1.创建数组2.复制数组3.排序五....
    99+
    2024-04-02
  • 浅谈C#数组(二)
    目录一.枚举集合 1.IEnumerator接口 2.foreach语句 3.yield语句 二.元组(Tuple) 三.结构比较 可以先了解上一篇文章内容C#数组(一) 一.枚举集...
    99+
    2024-04-02
  • 浅谈C#索引器
    目录一、概要二、应用场景一、概要 索引器使你可从语法上方便地创建类、结构或接口,以便客户端应用程序可以像访问数组一样访问它们。编译器将生成一个 Item 属性(或者如果存在 Inde...
    99+
    2024-04-02
  • 浅谈PostgreSQL数据库
    近期工作重点一直放在数据库设计方面,借助这次机会抽时间整理了一些我对PostgreSQL数据库的理解,同时也是对近段时间学习的一个总结。对于很多人而言或许没有听说过这个数据库,通常我们耳边伴随的都是Orac...
    99+
    2024-04-02
  • 浅谈C++中thread库join和detach的区别
    目录C++11中thread库join和detach的区别线程状态线程环境join和detach的区别总结C++11中thread库join和detach的区别 线程状态 在一个线程...
    99+
    2024-04-02
  • python标准库
    Python有一套很有用的标准库(standard library)。标准库会随着Python解释器,一起安装在你的电脑中的。它是Python的一个组成部分。这些标准库是Python为你准备好的利器,可以让编程事半功倍。 我将根据我个人的使...
    99+
    2023-01-31
    标准 python
  • 浅谈Java基准性能测试之JMH
    目录一、JMH vs JMeter二、JMH基本用法2.1、创建JMH项目2.2、编写基准测试代码2.3、JMH打包、运行2.4、JMH与Springboot三、JMH注解3.1、J...
    99+
    2024-04-02
  • C++标准库封装的vector数组
    目录1、创建和使用vector对象2、vector对象的引用 前言: 如果构建基本类型的数组或者自定义类型的数组,那么需要自己扩展数组的功能,还有很多需要自己解决的问题,比如需要防止...
    99+
    2024-04-02
  • C++的sstream标准库详细介绍
    C++的sstream标准库介绍 接下来我们继续看一下C++风格的串流控制 ,C++引入了ostringstream、istringstream、stringstream这三个类,要...
    99+
    2022-11-15
    sstream C++
  • 浅析Python自带性能强悍的标准库itertools
    目录前言无限迭代有限迭代排列组合迭代前言   可迭代对象就像密闭容器里的水,有货倒不出 itertools是python内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极...
    99+
    2024-04-02
  • 浅谈数据库约束
    国有国法 家有家规其实很多时候技术和生活息息相关,怎样的需求就会有出来解决方案数据库也是那么一个神奇的东西,毕竟是关系型数据库,数据独立而又可以表表关联,有时候就需要约束,在某些时候要规规矩矩做人做事,才能...
    99+
    2024-04-02
  • 用C标准数学库精确计算标准正态分布的CDF
    要使用C标准数学库精确计算标准正态分布的累积分布函数(CDF),可以使用标准库中的`erf()`函数。`erf()`函数返回一个以x...
    99+
    2023-09-26
    C
  • 详解C标准库堆内存函数
    目录概述不同操作系统Ansi C内存分配器实现方案有所不同内存碎片与碎片整理内存分配器的好坏标准void* malloc( size_t size )void free( void*...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作