从C++开始的编程生活(10)——string类基本语法和auto自动推导类型
前言
本系列文章承接C语言的学习,需要有C语言的基础才能学会哦~
第10篇主要讲的是有关于C++的string类基本语法和auto自动推导类型。
C++才起步,都很简单!!
目录
前言
string类
基本语法
①string的构造
②string::operator[ ]
③string的遍历(迭代器)
size()、length()和capacity()
clear( )
shrink_to_fit( )
at( )
push_back( )和append( )
insert( )
reverse( )
reserve( )
auto自动推导类型
string类
基本语法
①string的构造
#include<string>int main()
{//空字符串std::string s1;//字符串“qwertyuio”std::string s2("qwertyuio");//字符串“qwertyuio”的前3个,即“qwe”std::string s3("qwertyuio", 3);//字符串“xxxxx···xxx”,100个 xstd::string s4(100, 'x');//拷贝s2,从索引4开始拷贝3个字符,即“tyu”std::string s5(s2, 4, 3);//拷贝s2,从索引4开始拷贝全部,即“tyuio”std::string s6(s2, 4);//拷贝s2,从索引4开始拷贝20个字符,但是因为s2的长度小于20,所以只拷贝到末尾,即“qwertyuio”std::string s7(s2, 4, 20);return 0;
}
②string::operator[ ]
string类重载了操作符 [ ] ,使得string类可以像数组一样进行索引。
#include<string>class string
{
public:char& operator[](sizze_t pos){assert(pos < _ size);return _str[pos];}
private:char* _str;size_t _size;size_t _capacity;
};
底层代码大致如此。
③string的遍历(迭代器)
string s1(“hello world”);//①for循环
for(int i = 0; i < s1.size(); i++)
{cout << s1[i] << " ";
}//②迭代器
string::iterator it1 = s1.begin();
while(it1 != s1.end())
{cout << *it1 << " ";++it1;
}
cout << endl;//③反向迭代器
string::reverse_iterator rit = rbegin();
while(rit != s1.rend())
{cout << *rit << " ";++rit;
}//④范围for遍历
for(char ch : s1)
{cout << ch << " ";
}
遍历可以依靠for循环、迭代器、反向迭代器和范围for进行。
Ⅰ.所有的容器都有定义迭代器iterator,用于遍历容器,如string、vector、list等。
Ⅱ.s1的begin指向首字符 ‘ h ',end指向s1的字符’ /0 ‘。
Ⅲ.反向迭代器reverse_iterator,rbegin指向最后一个有效字符,rend指向第一个字符。
Ⅳ范围for遍历自动取容器对象给左值,自动++,自动判断结束。但是没有办法修改容器自身的数据。底层依旧是迭代器。
Ⅴ.范围for也适用于数组。
还有const迭代器const_literator,迭代时不可以修改数据。迭代时的指针为cbegin和cend,和begin和end一模一样。
size()、length()和capacity()
s1.size();
s1.length();
s1.max_size();
s1.capacity();
①size和length都返回字符串长度,功能相同。
②max_size返回最大长度,不同的编译器和字长会有所不同。
③capacity返回最大容量,不包括’ /0 ‘。
④对于string,size和length没有区别,但是对于其他的一些容器——例如树——是没有length的概念的,所以专门定义size获取容器大小,为了统一,就也给string定义一个size函数。
clear( )
清空字符串
si.clear();
shrink_to_fit( )
字符串缩容
si.shrink_to_fit();
at( )
索引字符,区别于操作符 [ ] ,会抛出异常,而不是assert断言。
s1.at(10);
push_back( )和append( )
尾插。空间不足会扩容,扩容后尾插
s1.push_back('w');
s1.push_back('y');
s1.append('I am human');
//尾插入10个“!”
s1.append(10, '!');
//尾插入部分字符
s1.append(s1.begin() + 1, s1.end());
前者尾插字符,后者尾插字符串。
实际上,我们尾插更多地使用+=符号。而且扩容的方式,不同的平台和编译器可能不一样。
insert( )
头插
s1.insert('1');
reverse( )
逆置字符串
//全部逆置
s1.reverse()
//选择部分逆置
s1.reverse(s1.begin(1), s1.end())
reserve( )
预留,保留空间供其使用,会额外扩容。
s1.reserve(100);
实际上可能会多给你一点空间。
auto自动推导类型
根据给的值,自动推导数据类型,不用再自己写数据类型了。
auto x = 1;//int类型
auto y = 1.1//double类型
auto z = '1';//char类型
auto m = &x;//int类型
int& n = x;
auto p = n;//int类型
auto& i = n//int&类型auto j;//报错
当我们要写一些名字很长的类型的时候,可以用auto,省事。
注意:
①想要auto推导引用类型要在auto后面加 & 。
②必须要初始化,否则auto无法推导出确定的数据类型,会报错。
③C++11才提供。
④和范围for融合,语法会十分方便。
for(auto ch : s1)
{cout << ch << " ";
}
⑤auto支持作为函数返回值类型,在C++20开始支持作为参数传入函数。这样使用auto要做好注释。
❤~~本文完结!!感谢观看!!接下来更精彩!!欢迎来我博客做客~~❤