C++STL(一)——string类
STL——string类
- 初始化
- string的赋值
- string的连接
- string的性质描述
- 遍历
- 字符指针和string的转化
- 查找、替换、交换
- 字符串的拼接
- 区间删除、
- 插入
- 大小写转换
- 比较
- 反向排序
- 字符串与数值类型的转化
初始化
string s1 = "aaa";
string s2("bbbb");//用字符串进行初始化
string s3 = s2; //通过拷贝构造函数
string s4 = (10,"A");//用同一个字符进行初始化
string的赋值
string &operator=(const string &s);//把字符串s赋给当前字符串
string &assign(const char *s);//用c类型字符串s赋值
string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值
string &assign(const string &s);//把字符串s赋给当前字符串
string &assign(int n,char c);//用n个字符c赋值给当前字符串
string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串
string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串
string的连接
string &operator+=(const string &s);//把字符串s连接到当前字符串的结尾
string &append(const char *s); //把c类型字符串s连接到当前字符串结尾
string &append(const char *s,int n);//把c类型字符串s的前n个字符连接到当前字符串结尾
string &append(const string &s); //同operator+=()
string &append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾
string &append(int n,char c); //在当前字符串结尾添加n个字符c
string &append(const_iterator first,const_iterator last);//把迭代器first和last之间的部分连接到当前字符串的结尾
string的性质描述
string的特性描述:
int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)
int max_size()const; //返回string对象中可存放的最大字符串的长度
int size()const; //返回当前字符串的大小
int length()const; //返回当前字符串的长度
bool empty()const; //当前字符串是否为空,为空返回真值1,否则返回假值0
void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分
字符串的遍历
- 1.用for 循环
string a1="abcdefg";
for(int i=0;i<a1.length();i++)
{
cout<<a1[i]<<" ";
//用 string类函数at()进行访问cout<<a1.at[i];
//at()函数会抛出异常
}
- 2.用迭代器
for(string::iterator it=a1.begin();it<a1.end();it++)
cout<<*it;
字符指针和string的转化
- string转化为char * 类型
主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy();
1.data()方法,如:
1 string str = “hello”;
2 const char* p = str.data();//加const 3
3 char * p=(char*)str.data();// 强制转换
同时有一点需要说明,这里在devc++中编译需要添加const,否则会报错invalid conversion from const char* to char ,这里可以再前面加上const或者在等号后面给强制转化成char的类型。
下面解释下该问题,const char是不能直接赋值到char的,这样编译都不能通过,理由:假如可以的话,那么通过char就可以修改const char指向的内容了,这是不允许的。所以char要另外开辟新的空间,即上面的形式。
2.c_str()方法,如:
1 string str=“world”;
2 const char p = str.c_str();//同上,要加const或者等号右边用char
3.copy()方法,如:
- char * 转string(可以直接赋值)
1 string s;
2 char *p = "hello";//直接赋值
3 s = p;
// 或者
string str(p); //利用构造函数完成赋值函数原型为 string str(char *);
字符串的查找、替换和交换(使用类函数)
//find函数原型,rfind ,find_firs_of 等的函数的参数列表与find()函数的相同
/*
find()
int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置
int find(const char *s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置
int find(const char *s, int pos, int n) const;//从pos开始查找字符串s中前n个字符在当前串中的位置
int find(const string &s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()
*/
⚠️注意:当find等函数寻找目标字符/字符串 成功返回所在位置,失败时返回string::npos的值。
string str4 = "who is the bast booy is very good aaaa!!!";
//第一次出现 is 的位置(从零开始的位置)
//从 往后查找
int index = (int)str4.find("is",0);
cout<<"index:"<< index <<endl;
//从后往前找 用 rfind()函数 如果找不到返回值为-1(用法与 find相似)
//应用 求is 出现的次数和位置
int offindex =(int)str4.find("is",0); //先从0号位置 开始进行查找
while (offindex != string::npos) //npos= -1;
{
cout<<"offindex:"<<offindex<<endl;
offindex = offindex + 1;
offindex =(int) str4.find("is",offindex);
}
//深入应用 find 查找并 替换成 别的字符串,用replace(int pos,int len,char * s) // 删除从pos开始的len个字符,然后在pos插入字符串 s
int pos =(int)str4.find("is",0);
while(pos != string::npos)
{
str4.replace(pos,3,"IS");// 替换is用IS
pos =(int)str4.find("is",pos+=1);
}
//replace()函数的简单应用
string str5 = "aaa bbb ccc ";
str5.replace(4,3,"BBB");
cout<<str5;
//字符串交换swap();
string str_a = "abc";
string str_b = "def";
string str_c = str_a + str_b; //strc_c = "abcdef";
str_a.swap(str_b); //str_a = "abc",str_b = "def";
字符串的拼接
//+=,append(),push_back()在尾部添加字符
string str_a = "abc";
string str_b = "def";
string str_c = str_a + str_b; //strc_c = "abcdef";
str_a += str_b; //str_a = "abcedf"
str_a.append(str_c); //str_a = "abcdefabcdef";
str_b.push_back('z'); //把字符‘z’拼接到str_b 字符串的末尾
string字符串的插入和删除
string ar1="BBBBCCCC";
int position =(int) ar1.find("C",0);
ar1.erase(position,3); //从 pos位置开始删除3个字符
cout<<ar1<<endl;
string ar2 = "aaaaa ddddd eeee";
ar2.erase(ar2.begin(),ar2.end()); //删除ar2中 一段区间的字符
cout<<ar2.length()<<endl;
string ar3 = "abcdefghi";
string::iterator it = find(ar3.begin(),ar3.end(),'f'); //注意这里的find函数并非string内地类函数
ar3.erase(it); //删除 字符 f
cout<<ar3<<endl;
插入字符串
ar3.insert(2, "zzzz"); //注意这里的插入为在 2这个元素位置之前插入字符串
cout<<ar3<<endl;
ar3.insert(0, "1234567",5); //在位置0 之前插入 ”1234567“ 字符串中的五个元素
cout<<ar3<<endl;
ar3.push_back('a') // push_back()只能 将 某个字符 插入的ar3的末尾
string字符串大写或小写转换
string s= "aaaaaBBBB";
transform(s.begin(),s.end(),s.begin(),::toupper);
cout<<s<<endl;
transform(s.begin(),s.end(),s.begin(),::tolower);
cout<<s<<endl;
//在toupper/tolower前面加::,强制指定是C版本的(这时也不要include <cctype>了):
字符串比较
- 1. 用 == > < >= <=等被重载的运算符进行比较
C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得 比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string (“aaaa”) <string(aaaaa)。
- 2. 用compare()函数比较
//注:所谓“大”,是指字典序大(在字典中靠后)。
string s(“abcd”);
s.compare(“abcd”); //返回0
s.compare(“dcba”); //返回一个小于0的值
s.compare(“ab”); //返回大于0的值
s.compare(s); //相等
s.compare(0,2,s,2,2); //用”ab”和”cd”进行比较 小于零
s.compare(1,2,”bcx”,2); //用”bc”和”bc”比较。
字符串反向排序
string str3 = "hellow world !";
reverse(str3.begin(),str3.end()); //reverse(开始点,结束点);
cout<<str3<<endl;
字符串与数值类型的转化
- 字符串转化为数值型
//1. int aoti(const char *) 转化为int类型将字符串,要使用 atoi 其参数类型为 char* 所必须在用之前 将 str4 用 c_str()转化为char *,以下同理
string str4= "01234";
int zhi_1 = atoi(str4.c_str());
cout<<zhi_1<<endl; //zhi_1 = 1234
//2. long long aotl(const char *) 将字符串转化为长整型
string str5 = "12345678910";
long long int zhi_2 = atol(str5.c_str()); //zhi_2 = 12345678910
cout<<zhi_2<<endl;
//3. double atof(const char *);
string str6 = "66.77";
double zhi_3 = atof(str6.c_str());
cout<<zhi_3<<endl; // zhi_3 == 66.77
- 数值型转化为字符串
// 数值转化为字符串
//利用c++std名称空间的to_string()函数去完成
/* to_string()函数原型
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
*/
cout<<to_string(14.2)<<endl; //实型->string:输出14.200000
cout<<to_string(12301)<<endl; //整型->string:输出12301
cout<<to_string(123456789785)<<endl;//长整型->string:输出123456789785
cout<<to_string(true)<<endl; //布尔型->string:输出1
C++STL(一)——string类的更多相关文章
- STL 的string类怎么啦?
前言 上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对strin ...
- STL:string类中size()与length()的区别
结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...
- C++ STL介绍——String类
目录 1.简介 2.string类成员函数汇总 3.String类的构造函数以及析构函数 4.获取字符串长度 5.获取字符串元素 6.字符串比较方法 7.字符串输入输出 8.字符串查找函数 1.简介 ...
- STL之string类详解
通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了!下面先罗列出string类 ...
- STL库中string类内存布局的探究
在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...
- C++标准模板库Stand Template Library(STL)简介与STL string类
参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...
- 自定义String类,并且实现在STL容器中添加自定义的类型
13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 1 ...
- 洛谷 P1308 统计单词数【string类及其函数应用/STL】
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- C++——string类和标准模板库
一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...
随机推荐
- PAT-字符串处理-B1006 换个格式输出整数 (15分)
题目描述: 让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数.例如 234 应该被输出为 ...
- Hibernage错误:Could not open Hibernate Session for transaction
今天客户发来的错误,是SSH框架做的项目,是用户在登陆时候出现的错误,但刷新之后就没问题. 提示错误:Could not open Hibernate Session for transaction. ...
- Redis面试题集锦(精选)
1.什么是 Redis?简述它的优缺点? Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value 类型的内存数据库,很像memcached,整个数据库统统 ...
- etcdctl的使用
etcdctl是一个提供简洁命令的etcd客户端,使用etcdctl可以直接和etcd服务打交道,对etcd中的键值对进行增删改查. 安装etcdctl 下载etcdctl工具 下载地址:etcdct ...
- python网络协议
一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...
- delphi真正实现延时暂停功能
用delphi怎么实现延时功能?在delphi中有一个sleep()函数是用来暂停线程的,使用了它好像和死掉了似得,不好用,这么简单的延时动作用Timer控件有显得复杂了.下面给大家分享一个真正好用的 ...
- sqlmap详解
sqlmap是一个自动化的sql注入工具,其主要功能是扫描.发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库有MySQL, Oracle,PostgreSQL, Microsof ...
- CentOs安装配置Jenkins(一)
安装 RPM方式安装 #如果下列版本不是您需要的版本,可以到清华镜像站点查找自己需要的jenkins版本rpm地址 #清华镜像网址:https://mirrors.tuna.tsinghua.edu. ...
- HTTP2.0学习 与 Nginx和Tomcat配置HTTP2.0
目录 一.HTTP2.0 1.1 简介 1.2 新的特性 1.3 h2c 的支持度 二.Nginx 对 http2.0 的支持 2.1 Nginx 作为服务端使用http2.0 2.2 Nginx 作 ...
- Chrome EC框架探索_0.0_引言
0.0 引言 嵌入式硬件抽象框架常常面临着这样的尴尬:封装层次较高的(arduino,mbed)不能充分暴露必要的API并面临着性能问题,封装层次较低的(HAL,LL)接口复杂且开发困难.近日发现的一 ...