参考博客:https://blog.csdn.net/qq_37941471/article/details/82107077

     https://www.cnblogs.com/danielStudy/p/7127564.html#top

1、声明一个字符串

  • 标准库类型string表示可变长的字符序列,为了在程序中使用string类型,我们必须包含头文件: #include <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(""); //生成"1234456789"的复制品
string str3("", , );//结果为"123"
string str4("", ); //结果为"01234"
string str5(, ''); //结果为"11111"
string str6(str2, ); //结果为"3456789"

 2、string的大小和容量

  1. size()和length():返回string对象的字符个数,他们执行效果相同。
  2. max_size():返回string对象最多包含的字符数,超出会抛出length_error异常
  3. capacity():重新分配内存之前,string对象能包含的最大字符数
    string s("");
cout << "size=" << s.size() << endl;
cout << "length=" << s.length() << endl;
cout << "max_size=" << s.max_size() << endl;
cout << "capacity=" << s.capacity() << endl;

3、string的字符串比较

(1)C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。   

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

(2)另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。

  他返回一个整数来表示比较结果,返回值意义如下:0:相等 1:大于 -1:小于 (A的ASCII码是65,a的ASCII码是97)

// (A的ASCII码是65,a的ASCII码是97)
// 前面减去后面的ASCII码,>0返回1,<0返回-1,相同返回0
string A("aBcd");
string B("Abcd");
string C("");
string D("123dfg"); // "aBcd" 和 "Abcd"比较------ a > A
cout << "A.compare(B):" << A.compare(B)<< endl; // 结果:1 // "cd" 和 "Abcd"比较------- c > A
cout << "A.compare(2, 3, B):" <<A.compare(, , B)<< endl; // 结果:1 // "cd" 和 "cd"比较
cout << "A.compare(2, 3, B, 2, 3):" << A.compare(, , B, , ) << endl; // 结果:0 // 由结果看出来:0表示下标,3表示长度
// "123" 和 "123"比较
cout << "C.compare(0, 3, D, 0, 3)" <<C.compare(, , D, , ) << endl; // 结果:0

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

    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;

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

// 方法一: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

 6、string的查找:find

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

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

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

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

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

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

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

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

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

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

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

    //在当前字符串的pos索引位置开始,查找第一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到字符
  
   . size_t find_last_of(const char* s, size_t pos = npos) const; //在当前字符串的pos索引位置开始,查找最后一个位于子串s的字符,返回找到的位置索引,-1表示查找不到字符    . size_tfind_last_not_of(const char* s, size_t pos = npos) const; //在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到子串
        string s("dog bird chicken bird cat");

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

        // 1. 查找一个字符串
cout << s.find("chicken") << endl; // 结果是:9 // 2. 从下标为6开始找字符'i',返回找到的第一个i的下标
cout << s.find('i', ) << 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

7、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

    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;

8、string的删除:erase()

  1. 1. iterator erase(iterator p);//删除字符串中p所指的字符
  2. 2. iterator erase(iterator first, iterator last);//删除字符串中迭代器区间[first,last)上所有字符
  3. 3. string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引位置pos开始的len个字符
  4. 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; }

9、string的插入:push_back() 和 insert()

    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

10、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 ;
}

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

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;
}

C++(四十八) — string容器的基本操作的更多相关文章

  1. 《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)

    1.简介 webdriver有三种判断元素状态的方法,分别是isEnabled,isSelected 和 isDisplayed,其中isSelected在前面的内容中已经简单的介绍了,isSelec ...

  2. NeHe OpenGL教程 第四十八课:轨迹球

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)

    0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...

  4. 第四十八个知识点:TPM的目的和使用方法

    第四十八个知识点:TPM的目的和使用方法 在检查TPM目的之前,值得去尝试理解TPM设计出来的目的是为了克服什么样的问题.真正的问题是信任.信任什么?首先内存和软件运行在电脑上.这些东西能直接的通过操 ...

  5. abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十二(四十八)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  6. Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装

    MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...

  7. C#编程(四十八)----------列表

    C#中的List C#中deList怎么样?List<T>类是ArrayList类的泛型等效类,该类使用大小可按需动态增长的数组实现List<T>泛型接口. 泛型的好处:它为使 ...

  8. Linux性能优化实战学习笔记:第四十八讲

    一.上节回顾 上一节,我们一起学习了如何分析网络丢包的问题,特别是从链路层.网络层以及传输层等主要的协议栈中进行分析. 不过,通过前面这几层的分析,我们还是没有找出最终的性能瓶颈.看来,还是要继续深挖 ...

  9. Jmeter(四十八)_动态线程分析HTML测试报告

    概述 jmeterGUI模式下,性能测试的结果往往误差很大,因为GUI本身就会消耗一部分资源.所以我们常常用命令行去跑性能脚本,得出结果 同时,jmeter在命令行下还可以生成多维度的测试报告,里面包 ...

随机推荐

  1. java url 编码

    public static void main(String[] args) throws UnsupportedEncodingException { String encodeUrl = URLE ...

  2. 爬虫笔记之teambition登录验证码

    一.缘起 想做的事情太多,计划乱糟糟,想找个工具理一下,想起来了的很久之前用过teambition,打算看一下,然后在登录界面看到一个比较有意思的验证码: 这种倒是比较有意思哈,看着像是模仿12306 ...

  3. 问题解决: 此文件来自其他计算机,可能被阻止以帮助保护该计算机/WORD在试图打开文件时遇到错误……

    最近,在打开下载的office文档(包括word.excel.ppt等)时候,总是无法直接打开,错误提示如下: 无论是邮件中的还是别的网站下载的,均提示该错误.后来搜索相关资料发现,修改其文件属性即可 ...

  4. (记录问题)1.Canvas.drawArc()方法的问题

    先看看异常: 一眼看去就知道说的是方法找不到错误 后面发现是系统版本过低,4.0的系统找不到5.0后添加的方法报的错. 修改后完美解决

  5. npx vs npm

    npx vs npm npx 使用教程

  6. dd命令的使用

    1.dd命令的使用 dd命令用于复制文件并对源文件的内容进行转换和格式化处理,在有需要的时候可以使用dd命令对物理磁盘进行操作,使用dd对磁盘操作时,最好使用块设备文件. (1)命令语法 dd (选项 ...

  7. [源码]Python调用C# DLL例子(Python与.Net交互)

    K8Cscan C# DLL例子代码 namespace CscanDLL { public class scan { public static string run(string ip) { if ...

  8. 013 ECMAScript基础应用

    1.ECMAScript概述 (1)前端的发展历程 <1>web 1.0时代 最初的网页以HTML为主,是纯静态的网页.网页是只读的,信息流只能从服务的到客户端单向流通.开发人员也只关心页 ...

  9. 通过Fastdfs进行文件上传服务(文件和图片的统一处理)

    1.文件上传简单流程分析图: 2.Fastdfs介绍: Fastdfs由两个角色组成: Tracker(集群):调度(帮你找到有空闲的Storage) Storage(集群):文件存储(帮你保存文件或 ...

  10. BJFU-217-基于链式存储结构的图书信息表的逆序存储

    这道题可以用头插法创建列表,然后正常输出: #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struc ...