从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
int main()
{
//空字符串
std::string s1;
//字符串“qwertyuio”
std::string s2("qwertyuio");
//字符串“qwertyuio”的前3个,即“qwe”
std::string s3("qwertyuio", 3);
//字符串“xxxxx···xxx”,100个 x
std::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
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_iteratorrbegin指向最后一个有效字符rend指向第一个字符
范围for遍历自动取容器对象给左值自动++自动判断结束。但是没有办法修改容器自身的数据。底层依旧是迭代器。
Ⅴ.范围for也适用于数组

还有const迭代器const_literator迭代时不可以修改数据迭代时的指针为cbegin和cend,和begin和end一模一样。

size()、length()和capacity()

s1.size();
s1.length();
s1.max_size();
s1.capacity();

sizelength返回字符串长度,功能相同
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要做好注释。

❤~~本文完结!!感谢观看!!接下来更精彩!!欢迎来我博客做客~~❤

posted on 2025-09-17 20:42  ljbguanli  阅读(6)  评论(0)    收藏  举报