目录
1.标准库中的string类
1.1 string类
2.2 auto和范围for
2.2.1 auto关键字
2.2.2 范围for
2.3 string类的常用接口讲解
1.string类对象的常见构造
2.元素访问
3.迭代器(iterator)
3.1 begin 和 end
3.2 rbegin 和 rend
4.容器
5.修改
5.1 append
5.2 assign
5.3 insert
5.4 erase
5.5 replace
5.字符串操作
5.1 find
6.getline函数
6.1 第一种声明方式是传递三个参数。
6.2 第二种声明方式是传递两个参数
1.标准库中的string类
1.1 string类
头文件:#include<string>
string是管理字符串的类,在使用string类时,必须包含#include头文件以及using namespace std;
string类
其实string是typedef出来的,原型为basic_string<char>
2.2 auto和范围for
2.2.1 auto关键字
主要作用:替换长类型
auto错误使用总结:
(1).auto做类型不初始化
int main()
{
auto e;//错误
return 0;
}
(2).auto不能定义数组
int main()
{
auto a[10] = { 1,2,3,4 };//错误
return 0;
}
(3).auto不能做函数的参数(但是可以做返回值)
int add(auto a, auto b)//错误
{
return a + b;
}
int main()
{
int a = 1, b = 2;
cout << add(a, b);
return 0;
}
2.2.2 范围for
(1).C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围
内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。(2).范围for可以作用到数组和容器对象上进行遍历。
(3).范围for的底层很简单,容器遍历实际就是替换为迭代器。
遍历数组:
int main()
{
int a[10] = { 1,2,3,4,5 };
for (auto num : a)
{
cout << num << ' ';
}
return 0;
}
2.3 string类的常用接口讲解
1.string类对象的常见构造
(constructor)函数名称 | 功能说明 |
---|---|
string() (重点) | 构造空的string类对象,即空字符串 |
string(const char* s) (重点) | 用C-string来构造string类对象 |
string(const string&s) (重点) | 拷贝构造函数 |
int main()
{
string s1;
string s2("666");
string s3(s2);
cout << "string() " << s1 << endl;
cout << "string(const char* s) " << s2 << endl;
cout << "string(const string&s) " << s3 << endl;
}
运行结果:
(constructor)函数名称 | 功能说明 |
---|---|
string(size_t n, char c) | 开辟n个空间,全部初始化为c |
string(const string& str,size_t pos,size_t len=npos) | 从第pos个位置开始,拷贝len个字符 |
string(const char* s,size_t n) | 去字符串前n个 |
int main()
{
string s1("hello world");
string s2(5, 'a');
string s3(s1, 5, 6);
string s4("hello", 4);
cout << "string(size_t n, char c):" << s2 << endl;
cout <<"string(const string& str,size_t pos,size_t len=npos):"<<s3 << endl;
cout <<"string(const char* s,size_t n):"<< s4 << endl;
}
运行结果:
2.元素访问
operator[] | 重载[]号,可以利用下标直接获取改下标的字符,并且可以修改。 |
at | 与[]功能类似,如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。也支持修改。 |
back | 获取最后一个字符 |
front | 获取第一个字符 |
int main()
{
string s1("hello world");
cout << s1.at(1) << endl;
cout << s1[1] << endl;
cout << s1.front() << endl;
cout << s1.back() << endl;
s1[1] = '8';
cout << s1 << endl;
s1.at(1) = '0';
cout << s1 << endl;
return 0;
}
运行结果:
3.迭代器(iterator)
迭代器可用来遍历和访问容器
迭代器有四种
iterator
const_iterator
reverse_iterator
const_reverse_iterator
begin | 返回第一个位置的迭代器(正向) |
end | 返回最后一个位置的下一个位置的迭代器(正向) |
rbegin | 返回最后一个位置的迭代器(反向) |
rend | 返回第一个位置的迭代器(反向) |
cbegin | 返回(const)第一个位置的迭代器(正向) |
cend | 返回(const)最后一个位置的下一个位置的迭代器(正向) |
crbegin | 返回(const)最后一个位置的迭代器(反向) |
crend | 返回(const)第一个位置的迭代器(反向) |
3.1 begin 和 end
迭代器实现遍历
方法一:
int main()
{
string s1("hello world");
string::iterator t = s1.begin();
while (t != s1.end())
{
cout << *t;
t++;
}
return 0;
}
运行结果:
方法二:
C++11支持
int main()
{
string s1("hello world");
for (auto c : s1)
{
cout << c;
}
return 0;
}
运行结果:
迭代器实现修改
int main()
{
string s1("hello world");
string s2("hello world");
string::iterator t = s2.begin();
while (t != s2.end())
{
(*t)++;
cout << *t;
t++;
}
cout << endl;
for (auto& c : s1)//要加引用
{
c += 1;
cout << c;
}
return 0;
}
运行结果:
3.2 rbegin 和 rend
反向遍历string
int main()
{
string s("hello world");
string::reverse_iterator t = s.rbegin();
while (t != s.rend())
{
cout << *t;
*t++;
}
return 0;
}
注意:尽管是反向迭代器,仍然是 *t++。
4.容器
size | 返回string的大小,与length无区别 |
length | 返回string的长度,与size无区别 |
max_size | 返回string可容纳的最大长度 |
resize | 重新开辟空间 |
capacity | 返回当前string的容量 |
reserve | 可以提前开辟空间,扩大空间,可最小缩小空间到当前字符串的大小。 |
clear | 清除所有字符,但不修改容量 |
empty | 判断字符串是否为空 |
5.修改
operator+= | 在字符串后面添加字符或者字符串 |
append | 在字符串后面添加字符或者字符串 |
push_back | 将字符附加到字符串 |
assign | 将一个字符串分配给此字符串,覆盖赋值,会覆盖原先的字符串。 |
insert | 插入字符串 |
erase | 从字符串中删除字符串 |
replace | 替换字符串的一部分 |
swap | 交换字符串值 |
pop_back | 删除最后一个字符 |
5.1 append
int main()
{
string s("hello world");
s.append("6");
cout << s << endl;
s.append("999");
cout << s << endl;
return 0;
}
运行结果:
5.2 assign
int main()
{
string s("hello world");
s.assign("231");
cout << s << endl;
return 0;
}
运行结果:
5.3 insert
在pos之前位置插入字符串
实现头插:
int main()
{
string s("hello world");
s.insert(0, "hello mike");
cout << s << endl;
return 0;
}
运行结果:
5.4 erase
实现头删:
int main()
{
string s("hello world");
s.erase(0, 1);//在第0个位置删除1个字符
cout << s << endl;
return 0;
}
运行结果:
5.5 replace
int main()
{
string s("hello world");
s.replace(5, 1, "##");//从第5个开始的1个长度,替换为##
cout << s << endl;
return 0;
}
运行结果:
5.字符串操作
5.1 find
若成功找到,则返回所在字符串中的第一个位置,若没有找到,则返回string::npos
int main()
{
string s("hello world");
cout << s.find(" ") << endl;
return 0;
}
运行结果:
int main()
{
string s("hello world");
if (s.find("asd") == string::npos)
{
cout << "string::npos" << endl;
}
return 0;
}
运行结果:
6.getline函数
6.1 第一种声明方式是传递三个参数。
istream& getline( istream& is, string& strs, char delim );
is:istream类的对象,定义从哪里读取输入流。
strs:存储字符串的string字符串。
delim:规定遇到什么字符停止。
int main()
{
string s;
getline(cin, s, '*');
cout << s << endl;
return 0;
}
遇到*时停止输入。
运行结果:
6.2 第二种声明方式是传递两个参数
istream& getline( istream& is, string& str );
is:istream类的对象,定义从哪里读取输入流。
strs:存储字符串的string字符串。
两个参数时,默认遇到换行符时停止。
本篇完