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类的更多相关文章

  1. STL 的string类怎么啦?

    前言   上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对strin ...

  2. STL:string类中size()与length()的区别

    结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...

  3. C++ STL介绍——String类

    目录 1.简介 2.string类成员函数汇总 3.String类的构造函数以及析构函数 4.获取字符串长度 5.获取字符串元素 6.字符串比较方法 7.字符串输入输出 8.字符串查找函数 1.简介 ...

  4. STL之string类详解

    通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了!下面先罗列出string类 ...

  5. STL库中string类内存布局的探究

    在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...

  6. C++标准模板库Stand Template Library(STL)简介与STL string类

    参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...

  7. 自定义String类,并且实现在STL容器中添加自定义的类型

    13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 1 ...

  8. 洛谷 P1308 统计单词数【string类及其函数应用/STL】

    题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...

  9. C++——string类和标准模板库

    一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...

随机推荐

  1. Redis(6)——GeoHash查找附近的人

    像微信 "附近的人",美团 "附近的餐厅",支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一.使用数据库实现查找附近的人 我们都知道, ...

  2. web架构之Nginx简介(1)

    目录 1.Nginx概述 2.Nginx快速安装 2.1.源码方式安装Nginx 2.2.yum方式安装Nginx 3.Nginx配置文件 4.Nginx核心功能模块 5.Ningx目录介绍 1.Ng ...

  3. Idea安装教程以及环境变量配置

    IDEA安装以及JDK环境变量 环境变量配置 下载jdk

  4. Serverless与微服务

    Serverless 是一个更大的范畴,Serverless 不只计算,也包括存储.数据库.中间件等各种服务.Serverless = FaaS(函数即服务) + BaaS(后端即服务).其中 Ser ...

  5. 测试必知必会系列- Linux常用命令 - tar

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 压缩一 ...

  6. TCP断开连接(四次挥手)

    四次挥手 ACK建立连接之后都为1. 1.A发送释放连接报文段,FIN=1. 2.B收到并回复确认,TCP进入半关闭状态,即此时B能向A发送,但是A无法向B发送数据. 3.当B传输完所有数据之后,发送 ...

  7. vscode配置里关于 eslint配置不要有 "eslint.alwaysShowStatus": true

    "eslint.autoFixOnSave": true, "eslint.validate": [ "javascript", " ...

  8. Event loops秒懂

    Event loops秒懂 简介 JS是一种单线程脚本语言,为什么要设计成单线程? 举例说明,假设JS是多线程脚本语言,A线程修改了DOM,B线程删除了DOM,一旦B线程先执行完,DOM被删除了,A线 ...

  9. java-随机点名2(新手)

    //创建的一个包名. package qige; //导入一个包.import java.util.*; //定义一个类.public class SJdm { //公共静态的主方法. public ...

  10. HTML每日学习笔记(1)

    7.15.2019 1.HTML脚本——JavaScript的嵌入使用,使 HTML 页面具有更强的动态和交互性. <script> 标签用于定义客户端脚本,比如 JavaScript. ...