原:https://blog.csdn.net/qq_37941471/article/details/82107077

一. string的构造函数的形式:

string str:生成空字符串

string s(str):生成字符串为str的复制品

string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值

string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值

string s(num ,c):生成num个c字符的字符串

string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值

eg:

string str1;               //生成空字符串

string str2("123456789");  //生成"1234456789"的复制品

string str3("12345", 0, 3);//结果为"123"

string str4("012345", 5);  //结果为"01234"

string str5(5, '1');       //结果为"11111"

 string str6(str2, 2);      //结果为"3456789"

二. string的大小和容量:

1. size()和length():返回string对象的字符个数,他们执行效果相同。

2. max_size():返回string对象最多包含的字符数,超出会抛出length_error异常

3. capacity():重新分配内存之前,string对象能包含的最大字符数

三. string的字符串比较:

1. C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与c-string的比较(如 str<”hello”)。 在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小, 比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小(前面减后面)同时,string (“aaaa”) <string(aaaaa)。

2. 另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0:相等 1:大于 -1:小于 (A的ASCII码是65,a的ASCII码是97)

四. string的插入:push_back() 和 insert()

 void  test4(){

     string s1;

     // 尾插一个字符

     s1.push_back('a');

     s1.push_back('b');

     s1.push_back('c');

     cout<<"s1:"<<s1<<endl; // s1:abc

     // insert(pos,char):在制定的位置pos前插入字符char

     s1.insert(s1.begin(),'');

     cout<<"s1:"<<s1<<endl; // s1:1abc

 }

五、string拼接字符串:append() & + 操作符

 void test5(){

     // 方法一:append()

     string s1("abc");

     s1.append("def");

     cout<<"s1:"<<s1<<endl; // s1:abcdef

     // 方法二:+ 操作符

     string s2 = "abc";

     /*s2 += "def";*/

     string s3 = "def";

     s2 += s3.c_str();

     cout<<"s2:"<<s2<<endl; // s2:abcdef

 }

六、 string的遍历:借助迭代器 或者 下标法

 void test6(){

     string s1("abcdef"); // 调用一次构造函数

     // 方法一:下标法

     for( int i = ; i < s1.size() ; i++ ){

         cout<<s1[i];

     }

     cout<<endl;

     // 方法二:正向迭代器

     string::iterator iter = s1.begin();

     for( ; iter < s1.end() ; iter++){

         cout<<*iter;

     }

     cout<<endl;

     // 方法三:反向迭代器

     string::reverse_iterator riter = s1.rbegin();

     for( ; riter < s1.rend() ; riter++){

         cout<<*riter;

     }

     cout<<endl;

 }

七、 string的删除:erase()

1. iterator erase(iterator p);//删除字符串中p所指的字符

2. iterator erase(iterator first, iterator last);//删除字符串中迭代器区间[first,last)上所有字符

3. string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引位置pos开始的len个字符

4. void clear();//删除字符串中所有字符

 void test6(){

     string s1 = "";

     // s1.erase(s1.begin()+1);              // 结果:13456789

     // s1.erase(s1.begin()+1,s1.end()-2);   // 结果:189

     s1.erase(,);                       // 结果:189

     string::iterator iter = s1.begin();

     while( iter != s1.end() ){

         cout<<*iter;

         *iter++;

     }

     cout<<endl;

 }

八、 string的字符替换:

1. string& replace(size_t pos, size_t n, const char *s);//将当前字符串从pos索引开始的n个字符,替换成字符串s

2. string& replace(size_t pos, size_t n, size_t n1, char c); //将当前字符串从pos索引开始的n个字符,替换成n1个字符c

3. string& replace(iterator i1, iterator i2, const char* s);//将当前字符串[i1,i2)区间中的字符串替换为字符串s

 void test7(){

     string s1("hello,world!");

     cout<<s1.size()<<endl;                     // 结果:12

     s1.replace(s1.size()-,,,'.');           // 结果:hello,world.

     // 这里的6表示下标  5表示长度

     s1.replace(,,"girl");                    // 结果:hello,girl.

     // s1.begin(),s1.begin()+5 是左闭右开区间

     s1.replace(s1.begin(),s1.begin()+,"boy"); // 结果:boy,girl.

     cout<<s1<<endl;

 }

九、 string的大小写转换:tolower()和toupper()函数 或者 STL中的transform算法

方法一:使用C语言之前的方法,使用函数,进行转换

 #include <iostream>

 #include <string>

 using namespace std;

 int main(){

     string s = "ABCDEFG";

     for( int i = ; i < s.size(); i++ ){

         s[i] = tolower(s[i]);

     }

     cout<<s<<endl;

     return ;

 }

方法二:通过STL的transform算法配合的toupper和tolower来实现该功能

 #include <iostream>
#include <algorithm>
#include <string>
using namespace std; int main(){ string s = "ABCDEFG";
   string result; transform(s.begin(),s.end(),s.begin(),::tolower); cout<<s<<endl; return ; }

十、 string的查找:find

1. size_t find (constchar* s, size_t pos = 0) const;

//在当前字符串的pos索引位置开始,查找子串s,返回找到的位置索引,

-1表示查找不到子串

2. size_t find (charc, size_t pos = 0) const;

//在当前字符串的pos索引位置开始,查找字符c,返回找到的位置索引,

-1表示查找不到字符

3. size_t rfind (constchar* s, size_t pos = npos) const;

//在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,

-1表示查找不到子串

4. size_t rfind (charc, size_t pos = npos) const;

//在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符

5. size_tfind_first_of (const char* s, size_t pos = 0) const;

//在当前字符串的pos索引位置开始,查找子串s的字符,返回找到的位置索引,-1表示查找不到字符

6. size_tfind_first_not_of (const char* s, size_t pos = 0) const;

//在当前字符串的pos索引位置开始,查找第一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到字符

7. size_t find_last_of(const char* s, size_t pos = npos) const;

//在当前字符串的pos索引位置开始,查找最后一个位于子串s的字符,返回找到的位置索引,-1表示查找不到字符

8. size_tfind_last_not_of (const char* s, size_t pos = npos) const;

//在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到子串

void test8()

{

string s("dog bird chicken bird cat");

//字符串查找-----找到后返回首字母在字符串中的下标

// 1. 查找一个字符串

cout << s.find("chicken") << endl;        // 结果是:9

// 2. 从下标为6开始找字符'i',返回找到的第一个i的下标

cout << s.find('i',6) << endl;            // 结果是:11

// 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标

cout << s.rfind("chicken") << endl;       // 结果是:9

// 4. 从字符串的末尾开始查找字符

cout << s.rfind('i') << endl;             // 结果是:18-------因为是从末尾开始查找,所以返回第一次找到的字符

// 5. 在该字符串中查找第一个属于字符串s的字符

cout << s.find_first_of("13br98") << endl;  // 结果是:4---b

// 6. 在该字符串中查找第一个不属于字符串s的字符------先匹配dog,然后bird匹配不到,所以打印4

cout << s.find_first_not_of("hello dog 2006") << endl; // 结果是:4

cout << s.find_first_not_of("dog bird 2006") << endl;  // 结果是:9

// 7. 在该字符串最后中查找第一个属于字符串s的字符

cout << s.find_last_of("13r98") << endl;               // 结果是:19

// 8. 在该字符串最后中查找第一个不属于字符串s的字符------先匹配t--a---c,然后空格匹配不到,所以打印21

cout << s.find_last_not_of("teac") << endl;            // 结果是:21

}

十一、 string的排序:sort(s.begin(),s.end())

 #include <iostream>

 #include <algorithm>

 #include <string>

 using namespace std;

 void test9()

 {

     string s = "cdefba";

     sort(s.begin(),s.end());

     cout<<"s:"<<s<<endl;     // 结果:abcdef

 }

十二、 string的分割/截取字符串:strtok() & substr()

 strtok():分割字符串

 void test10(){

     char str[] = "I,am,a,student; hello world!";

     const char *split = ",; !";

     char *p2 = strtok(str,split);

     while( p2 != NULL ){

         cout<<p2<<endl;

         p2 = strtok(NULL,split);

     }

 }

 void test11(){

     string s1("");

     string s2 = s1.substr(,); // 结果:23456-----参数5表示:截取的字符串的长度

     cout<<s2<<endl;

 }

string的学习的更多相关文章

  1. C#文本处理(String)学习笔记

    摘要:string是编程中使用最频繁的类型.一个string表示一个恒定不变的字符序列集合.string类型直接继承自object,故他是一个引用类型,也就是说线程的堆栈上不会有任何字符串(直接继承自 ...

  2. Python 3之str类型、string模块学习笔记

    Windows 10家庭中文版,Python 3.6.4, Python 3.7官文: Text Sequence Type — str string — Common string operatio ...

  3. 标准类型String(学习中)

    1.读取string对象 #include<iostream> #include<cstring> using namespace std; int main() { stri ...

  4. java中String类学习

    java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度. (3)charAT:字符操作,按照索引值获得字符串中的指定字符 ...

  5. String详细学习

    学这些东西,就像是扎马步.小说里郭靖学不会招数,就会扎马步.搞JS,内力还是必须要深厚,深厚,深厚. 1,stringObject.slice(start,end) slice() 方法可提取字符串的 ...

  6. java中String类学习笔记

    1.String的两种实例化方式 String str="hello";//直接赋值的方式: String str=new String("hello");// ...

  7. 关于String类学习的一些笔记(本文参考来自程序员考拉的文章)

    String 类继承自 Object 超类,实现的接口有:Serializable.CharSequence.Comparable<String> 接口,具体如下图: 一.常用的Strin ...

  8. 《C++ Primer Plus》16.1 string类 学习笔记

    16.1.1 构造字符串程序清单16.1使用了string的7个构造函数.程序清单16.1 str1.cpp---------------------------------------------- ...

  9. C++ string类学习总结

    C++字符串技术 string类  string对象在大多数应用中被用来消除对char*指针的使用,支持所期望的一些操作; 可以转换成char*,保持和现代代码的兼容性,还能自动处理内存管理; 一些s ...

随机推荐

  1. 接口和抽象类是否继承了Object

    我们先看一下Java的帮助文档对于Object的描述: Class Object is the root of the class hierarchy. Every class has Object ...

  2. uint16,uint32是什么?

    记得之前在刷笔试题的时候就看见过这个问题,发现当时上网百度后又忘了. 最近在看CryEngine3引擎代码的时候又晕了,趁现在赶紧记下来~ 在查看CE3的代码时我发现了这个变量,TFlowNodeId ...

  3. Spring Boot:使用Redis存储技术

    综合概述 Redis是一个开源免费的高性能key-value数据库,读取速度达110000次/s,写入速度达81000次/s.Redis支持丰富的数据类型,如Lists, Hashes, Sets 及 ...

  4. spring_three

    转账案例 坐标: ; } } 创建增强类Logger.java /** * 用于记录日志的工具类,它里面提供了公共的代码 */ @Component("logger") @Aspe ...

  5. CSS3 入门级

    从刚开始学习的选择器总共有十三种: id class 标签 子代 后代 交集 并集 通配符 伪类 结构 属性 相邻 兄弟 (全当复习,如果有用的话那就正好) div[name=zhang]  这是属性 ...

  6. SQL 对float类型列进行排序引发的异常

    车祸现场 要求:根据学分和完成时间获取前200名学员,当学分相同时,完成时间较早的排在前面 可以明显看到,完成时间为4.1号的记录排在了3.27号前面. 事故原因 float 表示近似数值,存在精度损 ...

  7. BFS(一):广度优先搜索的基本思想

    广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略. 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的.首先生成第一层 ...

  8. php设计模式-责任链模式

    责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景.比如是根据不同会员等级给予不同的优惠力度. 它的定义:对象的调用是由下家的应用连接起来的处理链.一直 ...

  9. ABP开发框架前后端开发系列---(15)ABP框架的服务端和客户端缓存的使用

    缓存在一个大型一点的系统里面是必然会涉及到的,合理的使用缓存能够给我们的系统带来更高的响应速度.由于数据提供服务涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发 ...

  10. JS格式化JSON后的日期

    序列化后日期变成了 /Date(1494524134000+0800)\ 这种格式 不能正常显示了 但也不能为了这个吧所有服务的DateTime字段都改成String类型 于是找了一个JS的扩展方法来 ...