网站ie兼容性,html网页设计环保网站,网站 域名解析出错,开发门户网站C#xff1a;渴望力量吗#xff0c;少年#xff1f; 文章目录 一、STL1. 概念2. STL的六大组件3. STL的重要性 二、string类的介绍与使用1. 介绍2. 使用#xff08;1#xff09;string类对象的常见构造#xff08;2#xff09;string类对象的容量操作#xff08;3… C渴望力量吗少年 文章目录 一、STL1. 概念2. STL的六大组件3. STL的重要性 二、string类的介绍与使用1. 介绍2. 使用1string类对象的常见构造2string类对象的容量操作3string类对象的访问及遍历操作4string类非成员函数 一、STL
1. 概念 STL(standard template libaray-标准模板库)是C标准库的重要组成部分不仅是一个可复用的组件库而且是一个包罗数据结构与算法的软件框架。 此外STL的版本不止一个有由Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本后面又有了P. J. 版本RW版本SGI版本…… SGI版本由Silicon Graphics Computer SystemsInc公司开发继承自HP版本。被GCC(Linux)采用可移植性好可公开、修改甚至贩卖从命名风格和编程风格上看阅读性非常高。我们后面学习STL要阅读部分源代码主要参考的就是这个版本。
2. STL的六大组件 我们接下来要学的也是围绕这个图展开的。
3. STL的重要性 STL无论是在公司的C笔试还是面试都是必考的知识。网上有句话说“不懂STL不要说你会C”。STL是C中的优秀作品有了它的陪伴许多底层的数据结构以及算法都不需要自己重新造轮子站在前人的肩膀上我们得以更好地使用C进行开发。
二、string类的介绍与使用
1. 介绍 string是表示字符串的字符串类大体结构和C语言的字符串差不多但是不同的点在于这是一个容器在这个容器之中提供了很多有用的接口下面我们就是要来学习这些方法分别是什么以及如何使用。 注意在使用string类时必须包含头文件string以及using namespace std;
2. 使用
1string类对象的常见构造
(constructor)函数名称功能说明string() 重点构造空的string类对象即空字符串string(const char* s) 重点用C-string来构造string类对象string(size_t n, char c)string类对象中包含n个字符cstring(const strings) 重点拷贝构造函数
代码如下
void Teststring()//先大概看一下
{cout 我是Teststring endl;string s1; // 构造空的string类对象s1string s2(hello bit); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3cin s1;cout s1 endl;cout s2 endl;cout s3 endl;
}
void Test_string()
{cout 我是Test_string endl;string s1(hello worldxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyy);string s2(s1);//拷贝构造cout s2 endl;string s3(s1, 6, 5);//在下标为6的位置开始取5个字符cout s3 endl;string s4(s1, 6, 3);cout s4 endl;//下面的这个函数重载和上面s3和s4是同一个第三个参数是缺省参数npos也就是size_t 的 -1//当字符串长度小于第三个参数或者第三个参数不写时就直接取到字符串末尾string s5(s1, 6);cout s5 endl;string s6(s1, 6, s1.size() - 6);//等价于上一个但是还是上面那个好用因为不用自己计算cout s6 endl;string s7(10, a);//用10个a填充字符串cout s7 endl;string s8(s7.begin(), --s7.end());//注意--end的位置所对应的字符并不会被取到即左闭右开cout s8 endl;string s9(10, 42);//注意第二个参数可以写数字将被自动转换为ASCII为该数字所对应的字符cout s9 endl;
}
int main()
{Teststring();Test_string();return 0;
}2string类对象的容量操作
函数名称功能说明size重点返回字符串有效字符长度length返回字符串有效字符长度capacity返回已经分配的空间总大小empty 重点检测字符串是否为空串是返回true否则返回falseclear 重点清空有效字符reserve 重点请求更改capacity可以为字符串预留空间resize 重点将有效字符的个数改成n个多出的空间用字符c填充
注意 A. size()与length()方法底层实现原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是用size()。 B. clear()只是将string中有效字符清空不改变底层空间大小。 C. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个不同的是当字符个数增多时resize(n)用 ‘\0’ 来填充多出的元素空间resize(size_t n, char c)用字符c来填充多出的元素空间。 值得注意的是resize在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小因为空间不够resize使用就得扩容。如果是将元素个数减少底层空间总大小不变。即只扩容不缩容 D. reserve(size_t n0)为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserver不会改变容量大小。
3string类对象的访问及遍历操作
函数名称功能说明operator[ ] 重点返回pos位置的字符begin endbegin获取一个字符的迭代器end获取最后一个字符下一个位置的迭代器也就是’\0’rbegin rendrbegin获取最后一个字符(‘\0’)的前一个位置的迭代器rend获取第一个字符的的前一个位置的迭代器范围forC11支持更简洁的范围for的新遍历方式
4string类非成员函数
函数名称功能说明operator尽量少用因为传值返回导致深拷贝效率低operator 重点输入运算符重载operator 重点输出运算符重载getline 重点获取一行字符串
代码如下
void test_string1()
{cout 我是test_string1 endl;//下面两个本质上是调用构造函数string s1;string s2(hello);cin s1;cout s1 endl;cout s2 endl;// 比strcat效率高而且好用string ret1 s1 s1;cout ret1 endl;string ret2 s1 我来了;cout ret2 endl;
}void test_string2()
{cout 我是test_string2 endl;string s1(hello world);string s2 hello world;//单参数的构造函数的隐式类型转换// 遍历stringfor (size_t i 0; i s1.size(); i){// 读cout s1[i] ;//重载了 []不是数组访问实际上是返回第i个下标的字符}cout endl;for (size_t i 0; i s1.size(); i){// 写s1[i];//给s1的第i个下标的字符加1}cout s1 endl;// 迭代器(暂时当作指针使用)string::iterator it s1.begin();//while (it s1.end()) // 这里可以用小于号但是不建议,因为这里是物理空间上连续才可以用像list这种物理空间不连续的用不了while (it ! s1.end()) // 推荐玩法通用{//注意end是指向最后一个字符斜杠零的上一个字符的下一个也就是刚好是斜杠零// 读cout *it ;it;}cout endl;it s1.begin();while (it ! s1.end()){// 写*it a;it;}cout s1 endl;listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);listint::iterator lit lt.begin();while (lit ! lt.end()){cout *lit ;lit;}cout endl;
}//迭代器的好处在于屏蔽了底层的细节都可以使用通用的方法来访问和修改容器void test_string3()
{cout 我是test_string3 endl;string s1(hello world);string::iterator it s1.begin();while (it ! s1.end()){// 读cout *it ;it;}cout endl;//string::reverse_iterator rit s1.rbegin();auto rit s1.rbegin();//rbegin指向了字符串的最后一个字符也就是斜杠零的前一个while (rit ! s1.rend())//rend指向了第一个字符的前一个字符的位置{cout *rit ;rit;//注意虽然是但是这个迭代器是倒着走的}//当然也可以用正向的迭代器然后 --end 也可以达到同样的效果但是没有这个好用cout endl;// 原理编译时编译器把范围for替换成迭代器// 读for (auto ch : s1){cout ch ;}cout endl;// 写for (auto ch : s1){ch;}cout endl;cout s1 endl;
}void test_string4()
{cout 我是test_string4 endl;//string s1(hello worldxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyy);string s1(hello world);cout s1.size() endl;cout s1.length() endl;//注意只有string有length因为string出现的时间比stl早当时用的是length而后来的stl普遍用size//所以现在string既可以用size也可以用length但是其他的容器只有sizecout s1.capacity() endl;s1.clear();//clear只清理数据不释放空间可以打印capacity查看空间会由析构函数释放s1 张三;//一个汉字一般是两个字节cout s1 endl;cout s1.size() endl;cout s1.capacity() endl;
}int main()
{test_string1();test_string2();test_string3();test_string4();return 0;
}剩下的部分在下一篇 ~