原: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. asp.net core 系列之Response caching 之 Distributed caching(3)

    这篇文章讲解分布式缓存,即 Distributed caching in ASP.NET Core Distributed caching in ASP.NET Core 分布式缓存是可以在多个应用服 ...

  2. Docker环境下的前后端分离项目部署与运维(十一)Docker Swarm技术

    Docker Swarm技术 docker swarm技术(之前的docker集群都是在 一个虚拟主机上的,但是如果这个主机挂掉了over了,docker技术就是多个虚拟主机形成一个集群) Swarm ...

  3. SQL SERVER 之快照复制,事务复制,合并复制

    一.环境要求及说明 1.快照复制和事务复制是单向的(2005及以后的版本中加入了订阅端可更新的事务复制). 2.合并复制是双向的. 3.快照复制对表结构没有要求. 4.事务复制要求表有主键. 5.合并 ...

  4. spring 5.x 系列第10篇 —— 整合mongodb (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 配置文件位于com.heibaiying. ...

  5. Google浏览器插件之闪存过滤器

    一件很有意思的事情引发的无聊尝试. 博客园有个很有趣的功能,就是闪存,翻阅到07年园长对闪存的定义:      记录一闪而过的想法,高兴或者不高兴都可以发一下.我用这个一直以来的想法就是,想到点啥发点 ...

  6. EXPLAIN说明

    列名 类型 解释 id   SELECT语句的ID编号,优先执行编号较大的查询,如果编号相同,则从上向下执行 select_type SIMPLE 一条没有UNION或子查询部分的SELECT语句 P ...

  7. 什么是JS跨域请求

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  8. Skyline WEB端开发1——入门

    Skyline是一套优秀的三维数字地球平台软件.凭借其国际领先的三维数字化显示技术,它可以利用海量的遥感航测影像数据.数字高程数据以及其他二三维数据搭建出一个对真实世界进行模拟的三维场景.目前在国内, ...

  9. mysql重复数据下,删除一条重复数据

    delete from information where id in (select id from (select max(id) as id,count(*) as ccc from infor ...

  10. 为什么我使用 Linux 开发

    Linux 能用吗? 当我对 Linux 的印象似乎还停留在黑乎乎的命令行界面上的时候,我身边的一些朋友告诉我或者建议我使用 Linux 时,我会一脸惊讶的问他,那个怎么用(来开发或者日常使用)? L ...