媒介
上篇博客我们了解了STL,今天我们来学习string类的一些初始内容,别的,在string类开始前,我们先学习两个比力好用的东西,范围for和auto
跟我一起来吧,fellow me
一、auto和范围for
auto关键字
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,厥后这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
用auto声明指针类型时,用auto和auto*没有任何区别,**但用auto声明引用类型时则必须加&,当在同一行声明多个变量时,这些变量必须是相同的类型,**否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型界说其他变量
auto不能作为函数的参数,可以做返回值,但是建议审慎使用
auto不能直接用来声明数组
- #include<iostream>
- using namespace std;
- int func1()
- {
- return 10;
- }
- // 不能做参数
- void func2(auto a)
- {}
- // 可以做返回值,但是建议谨慎使用
- auto func3()
- {
- return 3;
- }
- int main()
- {
- int a = 10;
- auto b = a;
- auto c = 'a';
- auto d = func1();
- // 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
- auto e;
- cout << typeid(b).name() << endl;
- cout << typeid(c).name() << endl;
- cout << typeid(d).name() << endl;
- int x = 10;
- auto y = &x;
- auto* z = &x;
- auto& m = x;
- cout << typeid(x).name() << endl;
- cout << typeid(y).name() << endl;
- cout << typeid(z).name() << endl;
- auto aa = 1, bb = 2;
- // 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
- auto cc = 3, dd = 4.0;
- // 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
- auto array[] = { 4, 5, 6 };
- return 0;
- }
复制代码- #include<iostream>
- #include <string>
- #include <map>
- using namespace std;
- int main()
- {
- std::map<std::string, std::string> dict = { { "apple", "苹果" },{ "orange","橙子" }, {"pear","梨"}};
- // auto的用武之地
- //std::map<std::string, std::string>::iterator it = dict.begin();
- auto it = dict.begin();
- while (it != dict.end())
- {
- cout << it->first << ":" << it->second << endl;
- ++it;
- }
- return 0;
- }
复制代码 范围for
对于一个有范围的集合而言,由程序员来阐明循环的范围是多余的,偶然候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部门:第一部门是范围内用于迭代的变量,第二部门则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。
范围for可以作用到数组和容器对象上进行遍历
范围for的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到。
- #include<iostream>
- #include <string>
- #include <map>
- using namespace std;
- int main()
- {
- int array[] = { 1, 2, 3, 4, 5 };
- // C++98的遍历
- for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
- {
- array[i] *= 2;
- }
- for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
- {
- cout << array[i] << endl;
- }
- // C++11的遍历
- for (auto& e : array)
- e *= 2;
- for (auto e : array)
- cout << e << " " << endl;
- string str("hello world");
- for (auto ch : str)
- {
- cout << ch << " ";
- }
- cout << endl;
- return 0;
- }
复制代码 二、string类
为什么学习string类?
C语言中的字符串
C语言中,字符串是以’\0’末端的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
在OJ中,有关字符串的题目基本以string类的情势出现,而且在常规工作中,为了简单、方便、
快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。
2.1 string类(了解)
string类的文档先容:链接
在使用string类时,必须包罗#include头文件以及using namespace std;
2.2 string类的常用接口阐明
2.2.1 string类对象的常见构造
(constructor) 链接————函数名称功能阐明
string() ————————-构造空的string类对象,即空字符串
string(const char* s)——— 用C-string来构造string类对象
string(size_t n, char c) ——string类对象中包罗n个字符c
string(const string&s)——–拷贝构造函数
- void Teststring()
- {
- string s1; // 构造空的string类对象s1
- string s2("hello bit"); // 用C格式字符串构造string类对象s2
- string s3(s2); // 拷贝构造s3
- }
复制代码 2.2.2 string类对象的容量操作
size链接————返回字符串有效字符长度
length 链接———返回字符串有效字符长度
capacity链接 ——返回空间总大小
empty 连接 ——–检测字符串释放为空串,是返回true,否则返回false
clear 链接———–清空有效字符
reserve链接——–为字符串预留空间**
resize连接———-将有效字符的个数该成n个,多出的空间用字符c添补
上面的接口都生成了链接,可以在这里看到string类的相关接口函数的讲解
- size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
- clear()只是将string中有效字符清空,不改变底层空间大小。
- resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来添补多出的元素空间,resize(size_t n, charc)用字符c来添补多出的元素空间。注意:resize在改变元素个数时,假如是将元素个数增多,可能会改变底层容量的大小,假如是将元素个数淘汰,底层空间总大小稳定。
- reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。
上面这些有关容量的操作和使用方式在链接都会提到
别的就是这些有关容量的其实和我们再数据结构学的一些接口差不多,大家可以点链接看看
总结
本篇主要是学习了aotu关键字和范围for的使用,有了这个两个东西,在背面我们学习stl的过程惬意一些
另有就是string类的容量有关接口,今天的接口其实相对来说都很简单,因为从前都接触过。
下一篇博客将会深入了解string类的一些其他的接口,会有点难
今天的内容我们就到这里啦,不要走开,小编持续更新中~~~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |