原: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. 反向代理在APP通过无线路由接入3G/4G时的特殊作用

    由于某些需求,要临时搭建局域网络,给小范围内大量移动客户端提供特定的网络服务,这样的服务通常包含常见的HTTP服务.数据文件下载服务.RESTFul接口服务等.市面常见的非企业级WIFI路由器能够承受 ...

  2. IIS 站点和应用池命令启动和停止

    在CMD下执行如下命令: IIS站点: 停止站点: C:\Windows\System32\inetsrv\appcmd.exe stop site “XXXX” 启动站点: C:\Windows\S ...

  3. 《linux内核设计与实现》阅读笔记-进程与调度

      一.进程 process: executing program code(text section) data section containing global variables open f ...

  4. Python自学day-2

    一.模块     模块分两种:标准库和第三方库,标准库是不需要安装就可以使用的库.     import [模块名]:导入一个库,优先是在项目路径中寻找.自定义模块名不要和标准库模块名相同.   sy ...

  5. java源码解析之String类(二)

    上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并 ...

  6. Python 爬虫从入门到进阶之路(十三)

    之前的文章我们介绍了一下 BeautifulSoup4 模块,接下来我们就利用 BeautifulSoup4 模块爬取<糗事百科>的糗事. 之前我们已经分别利用 re 模块和 Xpath ...

  7. [apue] 等待子进程的那些事儿

    谈到等待子进程,首先想到的就是SIGCHLD信号与wait函数族,本文试图厘清二者的方方面面,以及组合使用时可能不小心掉进去的坑. 1. 首先谈单独使用SIGCHLD的场景.下面是一段典型的代码片段: ...

  8. 微服务-springboot+websocket在线聊天室

    一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  9. 并发编程-concurrent指南-信号量Semaphore

    Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. acquire( ...

  10. 并发编程-concurrent指南-计数器CountDownLatch

    java.util.concurrent.CountDownLatch 是一个并发构造,它允许一个或多个线程等待一系列指定操作的完成. CountDownLatch 以一个给定的数量初始化.count ...