预学先知
1.STL的六大组件,容器,算法,迭代器最为重要,allocator就是个内存池
2.STL是学习C++中一个很重要的方面,需要认真对待。“没有学过STL就不要说自己学过C++”; 三个境界:能用,明理,能扩展
3 .辅助学习的网站www.cplusplus.com
4.几个编码表
ascii – 表示英文编码表
unicode – 表示全世界文字编码表 utf-8 utf-16 utf-32
gbk --中文自己量身定做的编码表
Linux上一般设置utf-8
根据编码的不同,也有不同的方式进行存储
String类
1 .对应于C语言中的串,C++中式管理字符串的类, 同样以/0结尾,basic_string中每个字符用char存储
2 .构造方法中,重点掌握三个
#include<cstring>
#include<iostream>
using namespace std;
int main() {
//无参
string s1;
//带参
string s2("hello world");
//拷贝构造
string s3(s2);
cin >> s1;
cout << s1 << endl;
cout << s2 << " " << s3 << endl;
//其他的一些初始化方式
string s4(s2, 0, 3); // 左闭右开的
cout << s4 << endl;
string s5(s2, 2);//npos 就是无限大,可以将整个字符串初始化完
cout << s5 << endl;
string s6("heiheihei", 5);
cout << s6 << endl;
string s7(10, '.');
cout << s7 << endl;
return 0;
}
3 .size和length
都可以用来计算字符串的有效字符(不包含最后的标识符’\0’),两者没有区别,但是size符合各种容器,一般我们用size (历史原因,size的意思是“个数”,适用性更广,比如说树就讲个数,而string既可以讲长度也可以讲个数,但是用出来的效果没有什么区别)
int main() {
string s1("hello zkx");
//统计的是有效字符的个数,不包含\0
cout << s1.size() << endl;
cout << s1.length() << endl;
cout << s1 << endl;
cout << s1.capacity() << endl;//统计的也是有效个数
s1.clear();
cout <<s1<< endl;
cout << s1.capacity() << endl;//统计的也是有效个数
return 0;
}
4 . [ ]方括号
可以让string像数组一样访问每个字符,at也可以访问每个字符,但是在遇到数组越界等异常的时候,[ ] 方括号是直接断言assert强制报错,at是进行异常处理,另外[ ]用的比较多
#include<cstring>
#include<iostream>
using namespace std;
int main() {
string s1("hello zkx");
for (int i = 0; i < s1.size(); i++) {
cout << s1[i] << " ";
}
cout << endl;
for (int i = 0; i < s1.size(); i++) {
s1[i] += 1;
}
for (int i = 0; i < s1.size(); i++) {
cout << s1[i] << " ";
}
cout << endl;
return 0;
}
5 .附加字符方面,建议使用+
#include<cstring>
#include<iostream>
using namespace std;
int main() {
string s1;
s1.push_back('1');
s1.append("213");
s1 += "12312312";
cout << s1 << endl;
return 0;
}
6 . 遍历 + 修改 string 的三种方式以及反向迭代器的介绍
#include<cstring>
#include<iostream>
using namespace std;
int main() {
string s1("hello zkx");
//遍历的三种方法(也都可以队数据进行修改)
//方法一:for + [ ]
for (int i = 0; i < s1.size(); i++) {
cout << s1[i];
}
cout << endl;
//方法二:迭代器的方式
//暂且可以把迭代器理解成一个指针,通过*也可以对数据进行修改
string::iterator it = s1.begin();
while (it != s1.end()) {
*it += 1;
++it;
}
cout << endl;
it = s1.begin();
while (it != s1.end()) {
cout << *it << " ";
++it;
}
cout << endl;
//方法三:范围for/语法糖(其实本质也是迭代器,只不过写起来简单很多)
for (auto& e : s1) {
e -= 1;
}
for (auto e : s1) {
cout << e;
}
cout << endl;
//反向迭代器
//string::reverse_iterator rit = s1.rbegin();
auto rit = s1.rbegin();
while (rit != s1.rend()) {
cout << *rit;
rit++;
}
cout << endl;
return 0;
}
迭代器的意义是说明?
所有的容器都可以使用迭代器这种方式去访问修改
对于string,无论是正着倒着,下标+[ ] 的方式都很好用
但是如果是其他的数据结构(不支持下标