shopex进入网站自动回跳转到别的网站 是否被挂马,百度云空间能做网站吗,一件代发货源网,招聘网站建设需求分析文章目录 1. 什么是string#xff1f;2. auto和范围for的使用2. 1 auto2. 2 范围for 3. 迭代器的概念、const string的概念3. 1 迭代器的概念3. 2 const string的概念 1. 什么是string#xff1f; 在了解什么是string之前#xff0c;我们首先需要知道字符串是什么。在C语言中… 文章目录 1. 什么是string2. auto和范围for的使用2. 1 auto2. 2 范围for 3. 迭代器的概念、const string的概念3. 1 迭代器的概念3. 2 const string的概念 1. 什么是string 在了解什么是string之前我们首先需要知道字符串是什么。在C语言中字符串是指以’\0’结尾的一些集合。同时为了操作方便C语言也提供了一些库函数用来操作这些字符串。 但是这些函数与字符串是分离开的不符合OOP的思想------面向对象编程Object Oriented ProgrammingOOP面向对象程序设计是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。。同时需要用户自己管理底层空间稍不留神就会出现越界访问。 所以为了替代C语言原本令人诟病的字符串体系就有了string的诞生。因此可以认为string是C的字符串控制体系。 2. auto和范围for的使用
2. 1 auto 在C11之后标准委员会赋予auto全新的意义auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。 auto作为语法糖实际上是为了方便程序员进行更方便的操作。下面的代码就是全部的使用。 C20开始支持
//void Func1(auto x)
//{
//
//}//auto做函数返回值以函数实际 return 返回的值的类型为类型
//不建议使用auto做函数的返回值。因为函数返回值使用auto的话确认函数返回值的类型就会变得麻烦
auto Func(int x)
{auto y x;return y;
}//auto和范围for的使用
int main()
{//auto的使用auto x1 1;//auto根据实际对象1来自动推断类型auto x2 1.1;auto x3 hello world;int x4 1;int x5 x4;auto x6 x5;//auto无法判断类型是否是引用只能根据引用的对象来判断类型也就是引用对象的类型就是auto的类型//然而 auto 诞生的主要目的不是代替这些类型。而是代替一些过长的类型//例如listint It;//定义一个list对象ItIt.push_back(1);It.push_back(2);It.push_back(3);It.push_back(4);//往对象里面尾插1 2 3 4listint::iterator it1 It.begin();//定义一个list的迭代器it1it1指向list对象It的第一个位置listint::iterator是类型auto it2 It.begin();//定义一个list的迭代器it2it2指向list对象It的第一个位置auto自动推导类型因此省去了写前面的一长串while (it2 ! It.end()){it2;}//另一个例子std::mapstd::string, std::string dict;std::mapstd::string, std::string::iterator dit1 dict.begin();auto dit2 dict.begin();//auto代替的就是 std::mapstd::string, std::string::iterator 这一迭代器的类型//因此auto可以减轻程序员的编写负担。要是经常需要写那么长一串的类型的话本来就没剩几根的头发也是岌岌可危了//函数的形参为autoC20之后才开始支持//Func1();//函数返回类型为auto参数为int函数返回值为intFunc(1);return 0;2. 2 范围for 范围for的出现和auto一致均是为了方便程序员而推出的语法糖。 int main()
{// 范围for的使用// 适用于容器遍历和数组遍历// 原理范围for底层是迭代器string s1(hello world);//范围for会把右边的参数自动赋值给左边的变量左边的变量自动直到为空//自动取容器的数据赋值给左边的对象//自动自动判断结束for (auto ch : s1){//s1的值自动赋值给chch自动cout ch ;}cout endl;//由于范围for是把右边的值赋值给左边的变量再对左边的变量进行操作因此就会出现for (auto ch : s1){ch;cout ch ;//这里s1的值成功并且打印出来}cout endl;for (auto ch : s1){cout ch ;//这里s1的值不变。说明上面的是将s1拷贝给ch再在ch中操作没有对s1本身做出改变}cout endl;//如果想要在范围for里面改变s1就需要使用引用for (auto ch : s1)//引用传址操作{ch;}for (auto ch : s1){cout ch ;}cout endl;//还有另一种情况需要使用引用。当赋值的本体过大因此拷贝的代价过大就需要使用引用//那么使用引用之后不想要对本体做出改变怎么办使用constfor (const auto ch : s1){//ch;//编译器报错}//范围for的使用对象除了容器还有数组int a[] { 1,2,3,4,5,6,7,8 };//正常使用for循环去打印for (size_t i 0; i sizeof(a) / sizeof(int); i){cout a[i] ;}cout endl;//使用范围for去打印for (auto ch : a){cout ch ;}cout endl;return 0;
}3. 迭代器的概念、const string的概念
3. 1 迭代器的概念 在了解string是怎么使用之前,我们首先需要知道迭代器的存在。 迭代器iterator可以理解为一种像指针、能完成指针所有操作的对象。其定义为提供一种方法使之能够依次寻访某个容器所包含的所有元素而又无需暴露该容器底层的结构。 由于迭代器本身是抽象的概念所以会配合下面的代码进行说明。 //迭代器的概念
int main()
{string s1(Hello world!);//在C中我们想要访问string中的字符串有两种方式//1.下标//这里之所以能使用下标是因为在string这个容器中有关于[]运算符的重载所以能直接使用[]//下标的使用的是有前提的。就是对象的存储空间必须是线性的。如果是链表或者树那么下标的性能就会大幅下降cout 下标;for (size_t i 0; i s1.size(); i){cout s1[i] ;}cout endl;//2.迭代器cout 迭代器;//string::iterator 说明这是容器 string 的迭代器。it1是实例化的迭代器可以理解成像s1的指针。但是绝对不是指针迭代器是全新的概念string::iterator it1 s1.begin();//it1指向的是s1的开头while (it1 ! s1.end())//这里的end指向的不是world的d而是d的下一位通常是\0{cout *(it1) ;}cout endl;//迭代器也有反向的cout 反向编译器;string::reverse_iterator rit s1.rbegin();//这里rit指向的是world中的dwhile (rit ! s1.rend())//这里的rend指向的也不是hello中的h而是h的前一位{cout *(rit) ;//这里的意味着反向迭代器不仅仅是定义的反向运算符重载的方向也是反向的}return 0;3. 2 const string的概念
//const string 对象
int main()
{string s1(Hello world!);//const string对象必须使用const修饰的迭代器const string s2(s1);//const_iterator 和 const iterator的区别前者限定的是迭代器指向的内容后者限定的是迭代器本身//限定迭代器本身的话就会因为迭代器无法改变而没办法让 it1 访问后面的内容//string::const_iterator it1 s2.begin();auto it1 s2.begin();while (it1 ! s2.end()){//*it1 1;//const 修饰的对象无法改变大小cout *it1 ;//但是可以改变迭代器的大小从而改变指向的位置}cout endl;//const反向迭代器string::const_reverse_iterator rit1 s2.rbegin();while (rit1 ! s2.rend()){cout *rit1 ;}cout endl;return 0;
}