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. django使用户名和邮箱都能登录

    为了能够让邮箱也能登录,需要重新定义认证功能,需要把email添加成username用于认证 定义的class继承ModelBackend,使用Q方法并集 然后在settings.py里面添加 这样既 ...

  2. java开发——Cloneable接口、clone()方法和深浅拷贝

    1.实现Cloneable接口表明该类的对象是允许克隆的. 2.允许克隆的意思是:可以调用clone()方法. 3.深拷贝还是浅拷贝,取决于如何重写Object的clone()方法. 4.原对象和克隆 ...

  3. Python魔法方法之 __call__

    前言 Python的魔法方法是指Python内部已经包含的,被双下划线所包围的方法,这些方法在特定的操作时会自动被调用.魔法方法可以使Python的自由度变得更高,当不重载魔法方法时它可以在规定的默认 ...

  4. Simulink仿真入门到精通(十一) 模块的封装

    当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...

  5. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  6. Vue2.0 【第一季】第3节 v-for指令:解决模板循环问题

    目录 Vue2.0 [第一季] 第3节 v-for指令:解决模板循环问题 第三节 v-for 指令 一.基本用法: 二.排序 三.对象循环输出 Vue2.0 [第一季] 第3节 v-for指令:解决模 ...

  7. jmeter 性能测试基本过程及示例

    jmeter 为性能测试提供了一下特色: jmeter 可以对测试静态资源(例如 js.html 等)以及动态资源(例如 php.jsp.ajax 等等)进行性能测试jmeter 可以挖掘出系统最大能 ...

  8. vue中的$props、$attrs和$listeners研究 [包装iview组件]

    $props:当前组件接收到的 props 对象.Vue 实例代理了对其 props 对象属性的访问. $attrs:包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 ...

  9. 下载网页中的 pdf 各种姿势,教你如何 carry 各种网页上的 pdf 文档。

    关联词: PDF 下载 FLASH 网页 HTML 报告 内嵌 浏览器 文档 FlexPaperViewer swfobject. 这个需求是最近帮一个妹子处理一下各大高校网站里的 PDF 文档下载, ...

  10. Java-字节输入输出。(新手)

    参考手册: BufferedInputStream BufferedOutputStream 实例: import java.io.*; /* * 文件的复制方式 * 1 字节流读写单个字节 * 2 ...