原: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. Call调用webservice接口,使用命名空间和不使用命名空间的区别

    生活中我们会遇到许许多多的奇葩问题,而这些问题又是我们不得不解决的. 我先用一段代码来引出我想要说的内容: import javax.jws.WebMethod; import javax.jws.W ...

  2. 【MYSQL】mysql大数据量分页性能优化

    转载地址: http://www.cnblogs.com/lpfuture/p/5772055.html https://www.cnblogs.com/shiwenhu/p/5757250.html ...

  3. Java:synchronized关键字引出的多种锁

    前言 Java 中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁.本文不讨论 synchronized 的具体使用,而是研究下synchronized底层的锁机制,以及这 ...

  4. 职业生涯之完成OCM考试后的感想

    背景知识:关于OCM认证,百科是这样描述的: Oracle Certified Master(OCM) 大师认证资质是Oracle认证的最高级别.此认证是对技术.知识和操作技能的最高级别的认可.Ora ...

  5. MySQL login-path 本地快捷登陆

    目录 1.什么是 login-path 2. 配置 login-path 2.2.配置: 2.3.显示配置: 2.3.1.显示执行的login-path配置 2.3.2.显示所有的login-path ...

  6. 【Aizu - 0033】Ball (简单搜索)

    -->Ball 原文是日语,这里直接写中文了 Descriptions: 如图所示,容器中间有一枢轴,下方分为两路.容器上方开口,从1到10连续编号的小球从容器开口A放入.通过调整枢轴E的方向, ...

  7. 2017提高组D1T1 洛谷P3951 小凯的疑惑

    洛谷P3951 小凯的疑惑 原题 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想 ...

  8. 实战Spring4+ActiveMQ整合实现消息队列(生产者+消费者)

    引言: 最近公司做了一个以信息安全为主的项目,其中有一个业务需求就是,项目定时监控操作用户的行为,对于一些违规操作严重的行为,以发送邮件(ForMail)的形式进行邮件告警,可能是多人,也可能是一个人 ...

  9. c++学习书籍推荐《C和C++安全编码》下载

    <华章程序员书库:C和C++安全编码(原书第2版)>致力于解决C和C++中已经导致危险的.破坏性的常见软件漏洞的基本编程错误,这些漏洞自CERT 1988年创立以来就记录在案.针对导致这些 ...

  10. 从URL获取图片并保存到本地

    /// <summary> /// HttpWebRequest Property /// </summary> /// <param name="fileNa ...