【C++】string的使用与模拟实现
用auto声明指针类型时,;代码语言:javascriptAI代码解释当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。代码语言:javascriptAI代码解释代码语言:javascriptAI代码解释代码语言:javascriptAI代码解释代码语言:javascriptAI代码解释对于一个有范围的集
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&;
代码语言:javascript
AI代码解释
int main()
{
int x = 10;
auto y = &x;
auto* z = &x;
auto& m = x;
return 0;
}
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
代码语言:javascript
AI代码解释
int main()
{
//编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
auto cc = 3, dd = 4.0;
return 0;
}
auto不能作为函数的参数,可以做返回值,但是建议谨慎使用
代码语言:javascript
AI代码解释
// 不能做参数
void func2(auto a)
{
}
// 可以做返回值,但是建议谨慎使用
auto func3()
{
return 3;
}
auto不能直接用来声明数组
代码语言:javascript
AI代码解释
int main()
{
//编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
auto array[] = { 4, 5, 6 };
return 0;
}
代码语言:javascript
AI代码解释
int main()
{
// 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项,不然无法推导
auto e;
return 0;
}
范围for
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。 范围for可以作用到数组和容器对象上进行遍历 范围for的底层很简单,容器遍历实际就是替换为迭代器。
对于迭代器简单解释一下:
我们可以把迭代器在行为上看做是指针(因为它模拟指针的用法),但实际上它的实现不一定是指针,而是一个为了统一遍历各种数据结构而设计的抽象工具。
其实这种“统一接口”的特性,正是C++ STL(标准模板库)的基石。(慢慢体会)
代码语言:javascript
AI代码解释
#include<iostream>
#include <string>
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");//用"hello world"构造了一个string
for (auto ch : str)
{
cout << ch << " ";
}
cout << endl;
return 0;
}
有了上面两个的基础,我们在C++中遍历容器就比较方便。
1.2 string类的常用接口说明
对于string类我只讲解最常用的接口,因为各种原因导致string类有些冗余。
- string类对象的常见构造
|
函数名称 |
功能说明 |
|---|---|
|
string() (重点) |
构造空的 string 类对象,即空字符串 |
|
string(const char* s) (重点) |
用 C-string 来构造 string 类对象 |
|
string(size_t n, char c) |
string 类对象中包含 n 个字符 c |
|
string(const string& s) (重点) |
拷贝构造函数 |
代码语言:javascript
AI代码解释
void test()
{
string s1; // 构造空的 string 类对象 s1
string s2("hello world"); // 用 C 格式字符串构造 string 类对象 s2
string s3(s2); // 拷贝构造 s3
}
在这里插入图片描述
- string类对象的容量操作
|
函数名称 |
功能说明 |
|---|---|
|
size (重点) |
返回字符串有效字符长度 |
|
length |
返回字符串有效字符长度 |
|
capacity |
返回空间总大小 |
|
empty (重点) |
检测字符串是否为空串,是返回 true,否则返回 false |
|
clear (重点) |
清空有效字符 |
|
reserve (重点) |
为字符串预留空间** |
|
resize (重点) |
将有效字符的个数改成 n 个,多出的空间用字符填充 |
说明: size()与length(): 方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。 clear(): 只是将string中有效字符清空,不改变底层空间大小。 resize(size_t n) 与 resize(size_t n, char c): 都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。 reserve(size_t res_arg=0): 为string预留空间,不改变有效元素个数,但是reserve的参数小于string的底层空间总大小时,reserver会不会缩容是不确定的。
更多推荐



所有评论(0)