装饰网站建设策划书,哪里可以做外贸网站,企业网站建设哪里做网站好,虚拟产品网站个人主页 #xff1a; zxctscl 如有转载请先通知 文章目录 1. 为什么学习string类1.1 C语言中的字符串1.2 推荐学习网站 2. 标准库中的string类2.1 string类2.2 string类的常用接口说明2.2.1 constructor2.2.2 遍历string2.2.2.1 下标加[]遍历2.2.2.2 迭代器#xff08;itera… 个人主页 zxctscl 如有转载请先通知 文章目录 1. 为什么学习string类1.1 C语言中的字符串1.2 推荐学习网站 2. 标准库中的string类2.1 string类2.2 string类的常用接口说明2.2.1 constructor2.2.2 遍历string2.2.2.1 下标加[]遍历2.2.2.2 迭代器iterator遍历 1. 为什么学习string类
1.1 C语言中的字符串
C语言中字符串是以’\0’结尾的一些字符的集合为了操作方便C标准库中提供了一些str系列的库函数但是这些库函数与字符串是分离开的不太符合OOP的思想而且底层空间需要用户自己管理稍不留神可 能还会越界访问。
1.2 推荐学习网站
string的学习离不开“看”这里推荐两个网站一个是https://legacy.cplusplus.com/
还有一个C文档的官网是: https://en.cppreference.com/w/ 更喜欢第一个网站这里面还有c的库。在之后的博客中也是以第一个网站。
2. 标准库中的string类
2.1 string类
在第一个网站里面直接搜索就会看到 它是一个字符顺序表
它底层也是模板是basic_string
字符串是表示字符序列的类标准的字符串类提供了对此类对象的支持其接口类似于标准字符容器的接口但添加了专门用于操作单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型使用它的默认char_traits和分配器类型(关于模板的更多信息请参阅basic_string)。string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。注意这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列这个类的所有成员(如长度或大小)以及它的迭代器将仍然按照字节(而不是实际编码的字符)来操作。
总结 1、string是表示字符串的字符串类 2、 该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作。 3、string在底层实际是basic_string模板类的别名typedef basic_stringchar, char_traits, allocator string; 4、不能操作多字节或者变长字符的序列。
在使用string类时必须包含#include头文件以及using namespace std;
2.2 string类的常用接口说明
string类对象的常见构造
(constructor)函数名称功能说明string()重点构造空的string类对象即空字符串string(const char* s)重点用C-string来构造string类对象string(size_t n, char c)string类对象中包含n个字符string(const strings)重点拷贝构造函数
2.2.1 constructor
查看string类的Member functions 点constructor就会看见7个构造函数 其他的构造函数看说明就很简单了解但是来看看substring (3) 它当中的size_t len npos是什么意思呢? 如果len这个参数给的超过了这个字符串从pos位置开始给的长度举个例子从pos位置开始剩余的长度是10那么它超过了10有多少就给多少直接取到结尾。 如果len超过了剩余的长度或者给npos缺省参数那么这个就是从pos位置开始,直接取到结尾有多少就取多少。
点开来看看npos npos是string里面的一个静态成员常量。 为什么给的是负一就取到字符的结尾size_t无符号整形这里虽然存的是-1但底层存的是补码无符号整形原码和补码是一样的这里反而变成了整形的最大值也就是2^32-1。 来实现一下
#includeiostream
using namespace std;#includestring
void test_string1()
{string s0;string s1(hello world);string s2(s1);string s3(s1, 5, 3);string s4(s1, 5, 10);string s5(s1, 5);cout s0 endl;cout s1 endl;cout s2 endl;cout s3 endl;cout s4 endl;cout s5 endl;
}
int main()
{test_string1();return 0;
}来看看s3从第5个位置开始那就是从空格开始拷贝3个字符就是到o的位置。 2. string类对象的容量操作
函数名称功能说明size重点返回字符串有效字符长度length返回字符串有效字符长度capacity返回空间总大小empty 重点检测字符串释放为空串是返回true否则返回falseclear 重点清空有效字符reserve 重点为字符串预留空间**resize 重点将有效字符的个数该成n个多出的空间用字符c填充
注意
**size()**与length()方法底层实现原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是用size(),它的长度不包括\0。clear()只是将string中有效字符清空不改变底层空间大小。resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个不同的是当字符个数增多时resize(n)用0来填充多出的元素空间resize(size_t n, char c)用字符c来填充多出的元素空间。注意resize在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小如果是将元素个数减少底层空间总大小不变。reserve(size_t res_arg0)为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserver不会改变容量大小。
2.2.2 遍历string
那么要用什么样方式遍历呢
2.2.2.1 下标加[]遍历
void test_string2()
{string s1(hello world);for (size_t i 0; i s1.size(); i){cout s1[i] ;}cout endl;
}string是私有的不能拿到它的下标想要获取它的长度就用size返回它有多少个字符。
std::string::operator[]这里模拟的是数组。 a[i]就相当于*a(ai),就是返回它的第i个字符。
它的底层简单来实现一下 获取pos位置那个字符
class string
{
public:char operator[](size_t pos){return _str[pos];}
private:char* _str;size_t _size;size_t _capacity;
};来试试修改pos位置的字符
void test_string2()
{string s1(hello world);for (size_t i 0; i s1.size(); i){cout s1[i] ;}cout endl;for (size_t i 0; i s1.size(); i){s1[i] ;}cout endl;for (size_t i 0; i s1.size(); i){cout s1[i] ;}cout endl;
}如果给的是const对象就不能修改。 2.2.2.2 迭代器iterator遍历 iterator是一个类型定义在string里面所以它要指定类域才能取到。
string::iterator it3 s3.begin();while (it3 !s3.end()){cout *it3 ;it3;}cout endl;迭代器行为像指针一样的类型对象这个区间是一个左闭右开。
迭代器像指针但不是指针可以来一下它的类型。
用迭代器也可以实现string的修改 it3 s3.begin();while (it3 ! s3.end()){*it3-3 ;it3;}cout endl;这两种方式其实没有什么区别那为什么会有迭代器呢 迭代器是主流它屏蔽了底层的细节它才是容器的核心访问方式。链表不会用下标访问。 来看个例子
#includeiostream
using namespace std;#includestring
#includevector
#includelist
void test_string2()
{vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vectorint::iterator it v.begin();while (it ! v.end()){cout *it ;it;}cout endl;listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);listint::iterator itt lt.begin();while (itt ! lt.end()){cout *itt ;itt;}cout endl;
}范围for 自动取容器中的数据赋值给e自动迭代自动往后走自动结束。
for (auto e : s3){cout e ;}cout endl;范围for底层就是迭代器。
有问题请指出大家一起进步