string 常见用法详解

1. string 的定义

  1. //定义string的方式跟基本数据类型相同,只需要在string后跟上变量名即可
  2. string str;
  3. //如果要初始化,可以直接给string类型的变量进行赋值
  4. string str = "abcd";

2. string 中内容的访问

**(1) 通过下标访问 **

  1. //一般来说,可以直接像字符数组那样去访问string
  2. #include <stdio.h>
  3. #include <string>
  4. using namespace std;
  5. int main() {
  6. string str = "abcd";
  7. for(int i = 0; i < str.length(); i++) {
  8. printf("%c ", str[i]); //输出abcd
  9. }
  10. return 0;
  11. }
  12. //如果要读入和输出整个字符串,则只能用 cin 和 cout
  13. #include <iostream>
  14. #include <string>
  15. using namespace std;
  16. int main() {
  17. strng str;
  18. cin >> str;
  19. cout << str;
  20. return 0;
  21. }
  22. //使用printf来输出string
  23. //即用c_str()将stringelixir转换为字符数组进行输出
  24. #include <stdio.h>
  25. #include <string>
  26. using namespace std;
  27. int main() {
  28. string str = "abcd";
  29. printf("%s\n", str.c_str()); //将string型str使用c_str()变为字符数组
  30. return 0;
  31. }

**(2) 通过迭代器访问 **

  1. //定义迭代器
  2. string::iterator it;
  3. //通过*it来访问string里的每一位
  4. #include <stdio.h>
  5. #include <string>
  6. using namespace std;
  7. int main() {
  8. string str = "abcd";
  9. for(string::iterator it = str.begin(); it != str.end(); it++) {
  10. printf("%c", *it);
  11. }
  12. return 0;
  13. }
  14. //string和vector一样,支持直接对迭代器进行加减某个数字

3. string 常用函数实例解析

**(1) operator+= **

  1. //这是string的加法,可以将两个string直接拼接起来
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. int main() {
  6. string str1 = "abc", str2 = "xyz", str3;
  7. str3 = str1 + str2; //将str1和str2拼接,赋值给str3
  8. str1 += str2; //将str2直接拼接到str1上
  9. cout << str1 << endl;
  10. cout << str3 << endl;
  11. return 0;
  12. }

**(2) compare operator **

  1. //两个string类型可以直接使用==, !=, <, <=, >, >=比较大小
  2. //比较规则是字典序
  3. #include <stdio.h>
  4. #include <string>
  5. using namespace std;
  6. int main() {
  7. string str1 = "aa", str2 = "aaa", str3 = "abc", str4 = "xyz";
  8. if(str1 < str2) printf("ok1\n"); //如果str1字典序小于str2,输出ok1
  9. if(str1 != str3) printf("ok2\n"); //如果str1字典序不等于str3,输出ok2
  10. if(str4 >= str3) printf("ok3\n"); //如果str4字典序大于等于str3,输出ok3
  11. return 0;
  12. }

(3) length()/size()

  1. //length()返回string长度,即存放的字符数,时间复杂度为O(1)
  2. //size() 与 length()基本相同
  3. string str = "abcxyz";
  4. printf("%d %d\n", str.length(), str.size());

(4) insert()

  1. //string的insert()函数有很多种写法,这里给出几个常用的写法时间复杂度为O(N)
  2. // 1. insert(pos, string), 在pos号位置插入字符串string
  3. string str = "abcxyz", str2 = "opq";
  4. str.insert(3, str2); //往str[3]处插入opq,这里str2的位置直接写"opq"也是可以的
  5. cont << str << endl;
  6. // 2. insert(it, it2, it3)
  7. //it 为原字符串的欲插入位置, it2 和 it3 为待插字符串的首尾迭代器,用来表示串[it2, it3)将被插在it的位置上
  8. #include <iostream>
  9. #include <string>
  10. using namespace std;
  11. int main() {
  12. string str = "abcxyz", str2 = "opq"; //str是原字符串,str2是待插字符串
  13. //string的3号位(即c和x之间)插入str2
  14. str.insert(str.begin() + 3, str2.begin(), str2.end());
  15. cout << str << endl;
  16. return 0;
  17. }

**(5) erase() **

  1. //erase()有两种用法:删除单个元素,删除一个区间的所有元素。时间复杂度均为O(N)
  2. // 1. 删除单个元素
  3. //str.erase(it)用于删除单个元素,it为需要删除的元素的迭代器
  4. #include <iostream>
  5. #include <string>
  6. using namespace std;
  7. int main() {
  8. string str = "abcdefg";
  9. str.erase(str.begin() + 4); //删除4号位(即 e)
  10. cout << str << endl;
  11. return 0;
  12. }
  13. // 2. 删除一个区间内的所有元素
  14. //删除一个区间内的所有元素有两种方法
  15. //str.erase(first, last)
  16. //其中first为需要删除的区间的其实迭代器,而last则为需要删除的的区间的末尾迭代器的下一个地址
  17. //即为删除[first, last)
  18. #include <iostream>
  19. #include <string>
  20. using namespace std;
  21. int main() {
  22. string str = "abcdefg";
  23. //删除[str.begin() + 2, str.end() - 1)】内的元素,即cedf
  24. str.erase(str.begin() + 2, str.end() - 1);
  25. cout << str << endl;
  26. return 0;
  27. }
  28. //str.erase(pos, length)
  29. //其中pos为需要开始删除的起始位置,length为删除的字符个数
  30. #include <iostream>
  31. #include <string>
  32. using namespace std;
  33. int main() {
  34. string str = "abcdefg";
  35. str.erase(3, 2); //删除从3号位开始的2个字符,即de
  36. cout << str << endl;
  37. return 0;
  38. }

**(6) clear() **

  1. //clear()用以清空string中的数据,时间复杂度一般为O(1)
  2. #include <stdio.h>
  3. #include <string>
  4. using namespace std;
  5. int main() {
  6. string str = "abcd";
  7. str.clear(); //清空字符串
  8. printf("%d\n", str.length());
  9. return 0;
  10. }

**(7) substr() **

  1. //substr(pos, len)返回从pos号位开始,长度为len的字串,时间复杂度为O(N)
  2. #include <iostream>
  3. #include <string>
  4. using namespace std
  5. int main() {
  6. string str = "Thank you for your smile.";
  7. cout << str.substr(0, 5) << endl;
  8. cout << str.substr(14, 4) << endl;
  9. cout << str.substr(19, 5) << endl;
  10. }

(8) string::npos

  1. //string::npos是一个常数,其本身的值为-1
  2. //但由于是unsigned_int类型,因此实际上也可以认为是unsigned_int类型的最大值
  3. //string::npos用以作为find函数失配时的返回值。
  4. //下面实例中可以认为string::pos等于-1或者4295967295
  5. #include <iostream>
  6. #include <string>
  7. using namespace std;
  8. int main() {
  9. if(string::npos == -1) {
  10. cout << "-1 is true." << endl;
  11. }
  12. if(string::npos == 4294967295) {
  13. cout << "4294967295 is also true." << endl;
  14. }
  15. return 0;
  16. }

(9) find()

  1. //str::find(str2), 当str2是str的子串时,返回其在str中第一次出现的位置
  2. //如果str2不是str的子串,那么返回string::npos
  3. //str::find(str2, pos), 从str的pos号位开始匹配str2, 返回值与上相同
  4. //时间复杂度为O(nm),其中n和m分别为str和str2的长度
  5. #include <iostream>
  6. #include <string>
  7. using namespace std;
  8. int main() {
  9. string str = "Thank you for your smile.";
  10. string str2 = "you";
  11. string str3 ="me";
  12. if(str.find(str2) != string::npos) {
  13. cout << str.find(str2) << endl;
  14. }
  15. if(str.find(str2, 7) != string::npos) {
  16. cout << str.find(str2, 7) << endl;
  17. }
  18. if(str.find(str3) != string::npos) {
  19. cout << str.find(str) << endl;
  20. } else {
  21. cout << "I know there is no position for me." << endl;
  22. }
  23. return 0;
  24. }

(10) replace()

  1. //str.replace(pos, len, str2)把str从pos号位开始,长度为len的子串替换为str2
  2. //str.replace(it1, it2, str2)把str的迭代器[it1, it2)范围的子串替换为str2
  3. //时间复杂度为O(str.length())
  4. #include <iostream>
  5. #include <string>
  6. using namespace std;
  7. int main() {
  8. string str = "Maybe you will turn around.";
  9. string str2 = "will not";
  10. string str3 = "surely";
  11. cout << str.replace(10, 4, str2) << endl;
  12. cout << str.replace(str.begin(), str.begin() + 5, str3) << endl;
  13. return 0;
  14. }

STL string 常见用法详解的更多相关文章

  1. STL priority_queue 常见用法详解

    <算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...

  2. STL map 常见用法详解

    <算法笔记>学习笔记 map 常见用法详解 map翻译为映射,也是常用的STL容器 map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器) 1. map 的定义 / ...

  3. STL set 常见用法详解

    <算法笔记>学习笔记 set 常见用法详解 set是一个内部自动有序且不含重复元素的容器 1. set 的定义 //单独定义一个set set<typename> name: ...

  4. STL pair 常见用法详解

    <算法笔记>学习笔记 pair 常见用法详解 //pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素, //又不想因此定义结构体时,使用pair ...

  5. STL stack 常见用法详解

    <算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...

  6. STL queue 常见用法详解

    <算法笔记>学习笔记 queue 常见用法详解 queue翻译为队列,在STL中主要则是实现了一个先进先出的容器. 1. queue 的定义 //要使用queue,应先添加头文件#incl ...

  7. STL vector常见用法详解

    <算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...

  8. C++标准模板库(STL)——queue常见用法详解

    queue的定义 queue<typename> name; queue容器内元素的访问 由于队列本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素, ...

  9. C++标准模板库(STL)——map常见用法详解

    map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...

随机推荐

  1. IntelliJ IDEA利用Maven下载所需的JAR包到项目中

    直接复制JetBrains/../conf/settings.xml后修改镜像出现问题,然后用了这里的settings.xml配置文件.

  2. XXE_payload

    <?php $xmlfile = file_get_contents('php://input'); $creds=simplexml_load_string($xmlfile); echo $ ...

  3. 只要你用atom修改后保存代码文件的时候,你在chrome上的页面就会自动刷新。

    学习html和css的时候Ctrl+s 以后预览网页需要手动刷新 现在不用了 给chrome安装安装LivePage这个插件. 只要你用atom修改后保存代码文件的时候,你在chrome上的页面就会自 ...

  4. Raspberry PI 2上的802.11ac网卡驱动编译

    Raspberry PI 2上的802.11ac网卡驱动编译 最近在树莓派2上折腾视频,用来做FPV,但是发现2.4G的控会严重干扰2.4G WIFI,在开控的时候我的台式机+外置USB网卡都频频掉线 ...

  5. BrowserUtils

    import android.content.Context; import android.content.Intent; import android.net.Uri; public class ...

  6. Mysql - 面试题 获取每个学生的最高成绩

    题目 如下一个表, 三列, 姓名, 课程, 以及成绩, 现在想要得到知道每个学生最高成绩的课程名字. 解题

  7. nginx.conf 配置 (反向代理,负载均衡,fastdfs model)

    #user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/error.log notice;#error_l ...

  8. Java日志体系(二)log4j

    1.1 简介 Log4j是一个由Java编写可靠.灵活的日志框架,是Apache旗下的一个开源项目: 使用Log4j,我们更加方便的记录了日志信息,它不但能控制日志输出的目的地,也能控制日志输出的内容 ...

  9. React Native初始化项目0.47.1报错

    首先看一下安卓和iOS报错: iOS终端运行报错: Xcode运行报错: 解决办法一: 将版本降到0.44.3,修改package,具体请看我的另一篇博客: http://www.cnblogs.co ...

  10. 树莓派实现摄像头监控(使用motion和mjpg-streamer)

    购买raspBerryCarmen,大概20元, 启动树莓派,安装: `sudo apt install motion` 配置/etc/motion/motion.conf, `sudo vim /e ...