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. 带着问题,再读ijkplayer源码

    问题 主流程上的区别 缓冲区的设计 内存管理的逻辑 音视频播放方式 音视频同步 seek的问题:缓冲区flush.播放时间显示.k帧间距大时定位不准问题- stop时怎么释放资源,是否切换到副线程? ...

  2. 量子计算机编程(二)——QPU基础函数

    第二部分主要是QPU的基础功能,第一部分就像是我们有了哪些基本的语句,第二部分就是我们能写一些简单基础的函数,一些小模块,第三部分就是他的应用了. 先来看一下一个简单量子应用的结构: 第一步,将量子态 ...

  3. 无刷新上传图片,ajax 和 iframe

    iframe 上传 upload.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...

  4. vs code开发python时找不到当前目录下的文件、UnicodeDecodeError: 'gbk'

    一.vs code开发python时找不到当前目录下的文件, file = open("readme.txt")一直报错,找不到目录下面的文件 原来vscode 默认都是以打开的项 ...

  5. linux firewalld 防火墙操作命令

    查看防火墙的状态systemctl status firewalldTomcat默认使用8080端口,如果防火墙开启,需要开通8080端口firewall-cmd --zone=public --ad ...

  6. 【MySQL】Docker搭建MySQL8.0

    目录 Docker搭建MySQL8.0 目的: 1.安装Docker 2.查看docker镜像 3.拉取mysql官方镜像 4. 查看目前的镜像 5.运行docker mysql镜像 6.查看目前运行 ...

  7. 初识JVM:(二)Java的垃圾回收机制详解

    声明:本文主要参考https://www.cnblogs.com/codeobj/p/12021041.html 仅供个人学习.研究之用,请勿用于商业用途,如涉及侵权,请及时反馈,立刻删除. 一.Ja ...

  8. 《52讲轻松搞定网络爬虫》读书笔记 —— HTTP基本原理

    URI 和 URL URI :Uniform Resource Identifier,即统一资源标志符, URL :Universal Resource Locator,即统一资源定位符. 举栗子,加 ...

  9. HTML5 history-hash 随机选择彩票

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Python程序设计试验报告一: 熟悉IDLE和在线编程平台

    安徽工程大学 Python程序设计 实验报告                                                                  班级   物流192   ...