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. "长辈牌"电子产品:有一种评论朋友圈叫给你打电话

    一.长辈们使用电子产品的姿势集合 先问你一个问题:「怎么下载搜狗输入法?」 (非广告) 摁?看到这篇文章的你可能都有点懵,不就下载安装就完了吗?但是,真的就只是这样吗? 前一段时间,当家里的长辈问到我 ...

  2. elasticsearch-head 安装

    一.安装phantomjs(由于入坑多写一步,此步骤可省掉) 1.下载phantomjs 安装npm的时候会依赖phantomjs 所以我们先安装phantomjs phantomjs 下载地址:ht ...

  3. nes 红白机模拟器 第5篇 全屏显示

    先看一下效果图 放大的原理是使用最初级的算法,直接取对应像素法. /*================================================================= ...

  4. 一文深入了解史上最强的Java堆内缓存框架Caffeine

    它提供了一个近乎最佳的命中率.从性能上秒杀其他一堆进程内缓存框架,Spring5更是为了它放弃了使用多年的GuavaCache 缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持高并发的一 ...

  5. ggplot2(7) 定位

    7.1 简介 位置调整:调整每个图层中出现重叠的对象的位置,对条形图和其他有组距的图形非常有用: 位置标度:控制数据到图形中位置的映射,常用的是对数变换: 分面:先将数据集划分为多个子集,然后将每个子 ...

  6. 用shell脚本实现定时备份数据库

    1.备份数据库的方法 可以使用命令查看 ls  /usr/local/mysql/bin 这个mysqldump就是系统内置的用来备份数据库的工具. 2.实现方法 ①先随便进入一个位置创建一个目录 ② ...

  7. C++结构体和类的区别总结及各自优缺点

    结构体在栈里.而类在堆里. 结构体为值类型.而类是引用类型 结构体不能被继承,而类可以. 结构体无构造函数 类可以定义虚函数,而结构体不行. 结构在数据参数方面效率更高,简单数组的应用中成本很低.而类 ...

  8. C#的关键字Explicit 和 Implicit

    一.explicit和implicit explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符:implicit 关键字用于声明隐式的用户自定义的类型转换运算符. 总结来说: ...

  9. Hadoop集群搭建(四)~centos6.8关闭防火墙

    一.centos关闭防火墙 1,关闭防火墙.service iptables stop 2,关闭防火墙开机自启.chkconfig iptables off 3,查看防火墙状态.service ipt ...

  10. AVR单片机教程——走向高层

    本文隶属于AVR单片机教程系列.   在系列教程的最后一篇中,我将向你推荐3个可以深造的方向:RTOS.C++.事件驱动.掌握这些技术可以帮助你更快.更好地开发更大的项目. 本文涉及到许多概念性的内容 ...