C++STL—string类
string容器
1.1 string容器的基本概念
string容器是一个类 这个容器中有一个指针,指针维护了一个数组
string容器提供copy、find、insert、replace等等功能
使用string容器需要使用string头文件,即# include <string>
1.2 string容器常用操作
1.2.1 string的构造函数
/*
string();//创建一个空的字符串 例如: string str;
string(const string& str);//使用一个 string 对象初始化另一个 string 对象
string(const char* s);//使用字符串 s 初始化
string(int n, char c);//使用 n 个字符 c 初始化
*/
string str;
string str1("hello");
string str2(str1);
string str3(5, 'a');
cout << str << endl; //空字符串
cout << str1 << endl; //hello
cout << str2 << endl; //hello
cout << str3 << endl; //aaa
//注意:每一行代码是一个单独的例子
1.2.2 string基本赋值操作
/*
string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);//把字符串 s 赋给当前的字符串
string& operator=(char c);//字符赋值给当前的字符串
string& assign(const char *s);//把字符串 s 赋给当前的字符串
string& assign(const char *s, int n);//把字符串 s 的前 n 个字符赋给当前的字符串
string& assign(const string &s);//把字符串 s 赋给当前字符串
string& assign(int n, char c);//用 n 个字符 c 赋给当前字符串
string& assign(const string &s, int start, int n);//将 s 从 start 开始 n 个字符赋值给字符串
*/
string str;
string str1("helloworld");
str = "hehe"; //hehe
str = str1; // helloworld
str = 'a'; // a
str.assign("abcdefg"); //abcdefg
str.assign("abcdefg", 3); // abc
str.assign(str1);// helloworld
str.assign(5, 'c'); //ccccc
str.assign(str1, 0, 4); //hell
//注意:每一行代码是一个单独的例子
1.2.3 string中内容的访问
/*
char& operator[](int n);//通过[]方式取字符
char& at(int n);//通过 at 方法获取字符
通过迭代器访问
*/
(1) 通过下标访问
int main() {
string str = "abcdefg";
cout << str[0] << endl; // a
return 0;
}
(2) 通过at 方法获取字符
int main() {
string str = "abcdefg";
cout << str.at(2) << endl; // c
return 0;
}
(3)通过迭代器访问
string迭代器的定义:string::iterator it;
int main() {
string str = "abcdefg";
string::iterator it = str.begin();
cout << *(it + 3) << endl; //d
return 0;
}
1.2.4 string的拼接操作
/*
string& operator+=(const string& str);//重载+=操作符
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
string& append(const char *s);//把字符串 s 连接到当前字符串结尾
string& append(const char *s, int n);//把字符串 s 的前 n 个字符连接到当前字符串结尾
string& append(const string &s);//同 operator+=()
string& append(const string &s, int pos, int n);//把字符串 s 中从 pos 开始的 n 个字符连接到当前字符串结尾
string& append(int n, char c);//在当前字符串结尾添加 n 个字符
*/
string str1 = "abc", str2 = "def", str3, str4;
str3 = str1 + str2; // abcdef
str3 = str1 + "666"; //abc666
str3 = str1 + 'a'; //abca
str3.append(str1); //abc
str3.append("abcdef", 2); //ab
str2.append(str1); //defabc
str3.append(str1, 1, 2); //bc
str4.append(4, 'x'); //xxxx
//注意:每一行代码是一个单独的例子
1.2.5 string的查找
/*
int find(const string& str, int pos = 0) const; //查找str第一次出现位置, 从pos开始查找(pos可以省略,默认从0开始)
int find(const char* s, int pos = 0) const; //查找 s 第一次出现位置,从 pos开始查找
int find(const char* s, int pos, int n) const; //从 pos 位置查找 s 的前 n 个字符第一次位置
int find(const char c, int pos = 0) const; //查找字符 c 第一次出现位置
int rfind(const string& str, int pos = npos) const;//查找 str 最后一次位置, 从 pos 开始查找
int rfind(const char* s, int pos = npos) const;//查找 s 最后一次出现位置,从pos 开始查找最后一次位置
int rfind(const char c, int pos = 0) const; //查找字符 c 最后一次出现位置
*/
//常用:
string str = "Thank you for your smile";
string str2 = "you";
string str3 = "me";
cout << str.find(str2) << endl; //6
cout << str.find(str2, 8) << endl; // 14
cout << str.find(str3) << endl; // 常数string::npos用作为find函数失配时的返回值,为-1或者4294967295
//注意:每一行代码是一个单独的例子
1.2.6 string的替换
/*
string& replace(int pos, int n, const string& str); //替换从 pos 开始 n 个字符为字符串 str
string& replace(int pos, int n, const char* s); //替换从 pos 开始的 n 个字符为字符串 s
str.replace(it1, it2, str2)把str的迭代器[it1, it2)范围的子串替换为str2
*/
string str = "Maybe you will turn around";
string str2 = "will not";
string str3 = "surely";
string::iterator it = str.begin();
cout << str.replace(10, 4, str2) << endl; // Maybe you will not turn around
cout << str.replace(it + 6, it + 9, str3) << endl; // Maybe surely will turn around
//注意:每一行代码是一个单独的例子
1.2.7 字符串的比较
/*
compare 函数在>时返回 1,<时返回 -1,==时返回 0。
比较区分大小写,比较时参考字典顺序,排越前面的越小。
大写的 A 比小写的 a 小。 比较规则是字典序
int compare(const string &s) const;//与字符串 s 比较
int compare(const char *s) const;//与字符串 s 比较
*/
string str1 = "aa";
string str2 = "aa";
string str3 = "xyz";
cout << str1.compare(str2) << endl; // -1 因为str1 < str2
cout << str3.compare(str1) << endl; // 1 因为str3 > str1
cout << str1.compare(str2) << endl; // 0 因为str1 == str2
1.2.8 字符串的长度
/*
length()/size()都返回string的长度,即存放的字符数
*/
string str = "abcdef";
str.size(); //6
str.length(); //6
1.2.9 字符串的子串
/*
string substr(int pos = 0, int n = npos) const;//返回由 pos 开始的 n 个字符组成的字符串
*/
string str1 = "Thank you for your smile";
string s = str1.substr(0, 5); // Thank
str1.substr(6, 3); // you
1.2.10 string::npos
string::npos是一个常数,其本身的值为-1,但由于是unsigned_int类型,因此实际上也可以被认为是unsigned_int类型的最大值。
这个值在string成员函数中作len(或subblen)参数的值时,表示“知道字符串结束”;
作为返回值,它常用语表示没有匹配
1.2.11 字符串的插入
/*
string& insert(int pos, const char* s); //在pos的位置 插入字符串常量
string& insert(int pos, const string& str); //在pos的位置,插入字符串对象
string& insert(int pos, int n, char c);//在指定位置插入 n 个字符 c
insert(it1, it2, it3); it1为原字符串的欲插入位置,it2和it3为待插入字符串的首位迭代器,用来表示串[it2, it3)将被插在 it1上
*/
string str1 = "Thank you";
string str2 = "Love you";
cout << str1.insert(1, "aaa") << endl; //Taaahank you
cout << str2.insert(4, str1) << endl; //LoveThank you you
cout << str1.insert(2, 5, 'c'); //Thcccccank you
str1.insert(str1.begin() + 2, str2.begin() + 1, str2.begin() + 5);
cout << str1 << endl; //Thove ank you
//注意:每一行代码是一个单独的例子
1.2.12 字符串的删除
/*
1、删除单个元素:
str.erase(it)用于删除单个元素,it为需要删除的元素的迭代器
2、删除一个区间内的所有元素:
str.erase(first, last), 其中first为需要删除的区间的起始迭代器,last为末尾迭代器的下一个地址,即[first,last)
string& erase(int pos, int n = npos);//删除从 Pos 开始的 n 个字符
*/
string str = "abcdefg";
str.erase(str.begin() + 4); //abcdfg
str.erase(str.begin() + 1, str.begin() + 4); //aefg
str.erase(2, 4); //abg
1.2.13 字符串的清除
/*
str.clean()用以清空string中的数据
*/
string str = "abcdefg";
str.clean();
cout << str.length() << endl; //0
1.2.14 string和c风格的转换
void main(){
string str1; //对象
char* str2 = "hello str2";
//将char* 转换成 string(直接完成)
str1 = str2;
cout << str1 << endl; // hello str2
string str3 = // hello str2
//不能直接将string转换成char* 必须借助string中的c_str方法完成
//char* str4 = str3; 错误
char* str4 = const_cast<char *>(str3.c_str());
//const_cast < type-id > ( expression ) 去掉const属性
cout << str4 << endl; // hello str3
return 0;
}
C++STL—string类的更多相关文章
- C++标准模板库Stand Template Library(STL)简介与STL string类
参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...
- STL --> string类字符串
基本使用方法 一.输入 string s: cin >> s; getline(cin, s) ; //使用默认的'\n'作为终止符 getline(cin, s, '!') ; //以' ...
- C++STL(一)——string类
STL--string类 初始化 string的赋值 string的连接 string的性质描述 遍历 字符指针和string的转化 查找.替换.交换 字符串的拼接 区间删除. 插入 大小写转换 比较 ...
- STL 的string类怎么啦?
前言 上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对strin ...
- STL库中string类内存布局的探究
在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...
- STL:string类中size()与length()的区别
结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...
- C++ STL介绍——String类
目录 1.简介 2.string类成员函数汇总 3.String类的构造函数以及析构函数 4.获取字符串长度 5.获取字符串元素 6.字符串比较方法 7.字符串输入输出 8.字符串查找函数 1.简介 ...
- 自定义String类,并且实现在STL容器中添加自定义的类型
13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 1 ...
- STL之string类详解
通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了!下面先罗列出string类 ...
随机推荐
- 20、checkconfig
chkconfig控制的原理(/etc/init.d/里面设置脚本,在/etc/rc.d/rc..d中设置软连接,通过chkconfig进行管理,同时也加入到了service服务,chkconfig设 ...
- POJ 1016 Numbers That Count 不难,但要注意细节
题意是将一串数字转换成另一种形式.比如5553141转换成2个1,1个3,1个4,3个5,即21131435.1000000000000转换成12011.数字的个数是可能超过9个的.n个m,m是从小到 ...
- Java核心基础第3篇-Java流程控制
Java流程控制 本章一起来探讨下Java的流程控制语句.主要从以下几个方面展开: Java分支语句 Java循环语句 Java其实和其他任何的开发语言一样,分支语句和循环语句是必不可少的,有个这两个 ...
- SpringBoot | 1.2 全注解下的Spring IoC
前言 在学习SpringBoot之前,有几个Spring的重要的基础概念需要提一下,SpringBoot对这些基础概念做进一步的封装,完成自动配置.首先就是Spring的控制反转IOC,由于Sprin ...
- redis学习笔记(三)——redis的命令大全总结
总结了一些redis五种存储类型的常用命令以及一些通用操作命令,不是很全,是在学习的时候将学到的做了个汇总,使用的时候可以查一下. 笔记写在表格里面了,不好粘贴.......后面的直接截图了..... ...
- 转:nginx服务器配置
1. user www-data说明的是使用的用户,至于www-data这个用户是系统自带的,我们不用说系统里没有这个账户的,虽然这个账户具体是做什么的,我也不太清楚2.worker_processe ...
- bugku Crypto 下半部分wp
1. 百度托马斯这个人居然还发明了一种轮转的加密法,发现原理是,他将很多行乱序的26个字母,插到一根柱子上,参考糖葫芦的样子,可以旋转每一行,设置自己要发送的明文后,向对方发送乱码的一列,对方只要将这 ...
- coretext简单使用
相对于UIKit,使用coretext绘制文本效率高,具有更高的自由度,可随时插入图片,增加文本点击事件等. 1.增加文本的点击事件 思路:定义UILabel子类,设置可点击的富文本range及其他属 ...
- 高校表白App-团队冲刺第八天
今天要做什么 尝试连接数据库(MySQL) 做了什么 连接成功 遇到的问题 Android连接数据库可以采用JDBC连接,因为在Android开发中,大多数连接到远程MySQL数据库的方法是加入特定的 ...
- VS Code 与 ESP32 官方SDK配置
开发基于 ESP XXX 微控制器应用,最简单的环境搭建方案是像 MicroPython.CircuitPython.NanoFramework 等,下载固件,直接开刷:或者基于 Arduino 的开 ...