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类的更多相关文章

  1. C++标准模板库Stand Template Library(STL)简介与STL string类

    参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...

  2. STL --> string类字符串

    基本使用方法 一.输入 string s: cin >> s; getline(cin, s) ; //使用默认的'\n'作为终止符 getline(cin, s, '!') ; //以' ...

  3. C++STL(一)——string类

    STL--string类 初始化 string的赋值 string的连接 string的性质描述 遍历 字符指针和string的转化 查找.替换.交换 字符串的拼接 区间删除. 插入 大小写转换 比较 ...

  4. STL 的string类怎么啦?

    前言   上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对strin ...

  5. STL库中string类内存布局的探究

    在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...

  6. STL:string类中size()与length()的区别

    结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...

  7. C++ STL介绍——String类

    目录 1.简介 2.string类成员函数汇总 3.String类的构造函数以及析构函数 4.获取字符串长度 5.获取字符串元素 6.字符串比较方法 7.字符串输入输出 8.字符串查找函数 1.简介 ...

  8. 自定义String类,并且实现在STL容器中添加自定义的类型

    13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 1 ...

  9. STL之string类详解

    通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了!下面先罗列出string类 ...

随机推荐

  1. ES6深度解析3:Generators

    介绍ES6 Generators 什么是Generators(生成器函数)?让我们先来看看一个例子. function* quips(name) { yield "hello " ...

  2. CosId 1.1.8 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式 ID 生成器. 目前提供了三类 ID 生成器: SnowflakeId : 单机 TPS 性 ...

  3. ARTS第十二周

    1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的技术文章 以下是 ...

  4. Blazor 数据绑定开发指南

    翻译自 Waqas Anwar 2021年3月21日的文章 <A Developer's Guide to Blazor Data Binding> [1] 现如今,大多数 Web 应用程 ...

  5. C语言:监听键盘

    所谓键盘监听,就是用户按下某个键时系统做出相应的处理,本章讲到的输入输出函数也是键盘监听函数的一种,例如 getchar().getche().getch() 等.下面的代码演示了 getche() ...

  6. Spark编程基础_RDD编程

    RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合.RDD具有数据流模型的特 ...

  7. final修饰符(4)-"宏替换"

    对于一个final变量来说,不管它时类变量,实例变量还是局部变量,只要满足三个条件,这个final变量就不再是一个变量,而是一个直接量.final变量的一个重要用途,就是定义"宏变量&quo ...

  8. [刘阳Java]_Spring入门_第1讲

    Spring框架在企业中的使用非常多,优势明显.所以学好Spring框架肯定不言而喻.今天我们给大家介绍Spring的入门 1. 对于初学者来说我们要学习Spring框架中的哪些技术,这个有必要了解一 ...

  9. 痞子衡嵌入式:嵌入式Cortex-M裸机环境下临界区保护的三种实现

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是Cortex-M裸机环境下临界区保护的三种实现. 搞嵌入式玩过 RTOS 的朋友想必都对 OS_ENTER_CRITICAL().OS_ ...

  10. [NOIp2017]宝藏 题解

    非常巧妙的 \(O(n^23^n)\) 做法. 题目的本质是要求一棵生成树,使得其每条边的长度与这条边的起点深度乘积的和最小. 我们使用状压 DP,考虑到当前状态与已经打通的点和深度有关,不妨设 \( ...