c++---------------------------string
从今天开始我们就开始学c++的容器了就不需要我们造轮子了
1.为什么学习string类
1.1c语言中的字符串
C
语言中,字符串是以
'\0'
结尾的一些字符的集合,为了操作方便,
C
标准库中提供了一些
str
系列
的库函数,但是这些库函数与字符串是分离开的,不太符合
OOP
的思想,而且底层空间需要用户
自己管理,稍不留神可能还会越界访问
2.标准库中的string类
2.1
string类的文档介绍
在使用string的时候必须包含头文件和using namespace std等;
2.2auto和范围for
auto 关键字
在早期
C/C++
中
auto
的含义是:使用
auto
修饰的变量,是具有自动存储器的局部变量,后来这个
不重要了。
C++11
中,标准委员会变废为宝赋予了
auto
全新的含义即:
auto
不再是一个存储类型
指示符,而是作为一个新的类型指示符来指示编译器,
auto
声明的变量必须由编译器在编译时期
推导而得
。
用
auto
声明指针类型时,用
auto
和
auto*
没有任何区别,但用
auto
声明引用类型时则必须加
&
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际
只对第一个类型进行推导,然后用推导出来的类型定义其他变量
。
auto
不能作为函数的参数,可以做返回值,但是建议谨慎使用
auto
不能直接用来声明数组
// 不能做参数
void func2(auto a)
{}
// 可以做返回值,但是建议谨慎使用
auto func3()
{
return 3;
}
int a = 10;
auto b = a;
auto c = 'a';
auto d = func1();
// 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
auto e;
范围for
范围for可以用到数容器上进行遍历
范围
for
的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到
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;
2.3string常用的接口
string的初始化
string s1{ 1,23,46 };
string s2 = { 1,2,3,4,5 };
这两种初始化都是可以的当然也可以那s1来初始化s2
string s2(s1);
2.3.1size()接口
这个就是见词知意
就是用来求数组的大小的比如
之前我们还需要去用sizeof现在用了容器我们可以调用容器里面的函数直接使用
2.3.2capacity()
这个是用来返回空间总大小的
2.3.3empty()
这个是用来判断字符串是否为空是返回true,否则返回false
2.3.4 clear()
这个是用来清除有效字符
2.3.5 reserve
这个是用来为字符串预留空间比如
string s1{ 1,23,46 };
cout << s1.capacity();
这个空间大小是15
要是利用reserve
string s1{ 1,23,46 };
s1.reserve(20);
cout << s1.capacity();
他这个开辟空间就只有第一次是2被增容其他都是1.5扩大这个就是31
2.3.5 resize()
将有效字符的个数该成
n
个,多出的空间用字符
c
填充
string s1("hello world");
s1.resize(20,'x');
for (auto e : s1)
{
cout << e << " ";
}
2.3.6 operator[]()
返回
pos
位置的字符,
const string
类对象调用
std::string str ("Test string");
for (int i=0; i<str.length(); ++i)
{
std::cout << str[i];
}
2.3.7 begin()和end()
begin
获取一个字符的迭代器
+
end
获取最后一个字符下一个位
置的迭代器
例如:
string s1("hello world");
string::iterator it = s1.begin();
while (it != s1.end())
{
cout << *it << " ";
it++;
}
2.3.8 rbegin()和rend()
这个和上面差不多就是一个从前往后一个是从后往前
2.3.9 push_back()
这个就很简单了和我们之前写顺序表的时候一样这个就是尾插、
2.3.10 append()
这个就是在字符串后追加一个字符
string s1("hello world");
s1.append("hello");
string::iterator it = s1.begin();
while (it != s1.end())
{
cout << *it << " ";
it++;
}
2.3.11operator+=
在字符串后追加字符串
str
std::string name ("John");
std::string family ("Smith");
name += " K. "; // c-string
name += family; // string
name += '\n';
2.3.12 find和npos
从字符串
pos
位置开始往后找字符
c
,返回该字符在字符串中的
位置
string s1("hello world");
size_t f1 = s1.find("x");
if (f1 != string::npos)
{
cout << s1[f1] << endl;
}
else
{
cout << "没找到" << endl;
}
重点就这么多有兴趣的同学可以去官网查一下其他的使用