STL阶段一:怎么应用
string类:(动态的顺序表)
string类
C语言中的string是单独的管理配置,不利于类的运用。
string常见接口的说明
构造与销毁 |
容量操作 |
元素的访问操作 |
修改的操作 |
特殊的操作:字符串翻转 |
迭代器 |
1、string类的创建
函数方法 | 实例 | 解释 |
|
string() | string s1 | 创建一个空的字符串对象 | 直接创建对象 |
string(const char*) | string("hello") | 用c字符创创建一个字符创对象 |
|
string(size_t n,char c) | string(8,'p') | 创建一个8个'p'的字符串 |
|
string (const string&s) | string s2(s1) | 用s1创建一个s2 | 采用拷贝构造函数 |
2、string的容量操作
size | s.size( ) | 都是表示字符串当前字符数目 |
length | s.length( ) | |
capacity | s.capacity( ) | 字符串的最大容量 |
empty | s.empty( ) | 判断字符创串是否为空 |
clear | s.clear( ) | 清空字符串 |
reserve | s.reserve(100) |
|
resize | s.resize(14,'r') s.resize(11) |
|
| 常见的字符串操作函数:size length capacity empty clear resize reverse |
|
resize() | 其中resize():就是对当前对象的有效元素的个数的指定 注意:他不改变capacity的大小 s1.resize(18,'k');// 将字符串s1指定为18 个字符的唱那个度,对多出的部分用'k'填充 | string对象在底层是维护了个静态数组的buff,他的定长是15个字符。如果超过15个字符长度,就会进行动态数组扩容 |
reverse() | s1.reserve(18);// 她改变的就是capacity大小,但不是指定的大小,而是以16为单位的扩容,因此,现在的大小是31. |
|
3、string的遍历操作
operator 【】 | 重载了【】符号 | s1[2] == 'g' |
begin/end| rbegin/rend | 相当于指针的使用 带r的是反向的迭代器 | c++98:string::iterater it = s.begin(),就是把字符串的开始位置的指针给了it c++11:auto it = s.rbegin(), |
范围for | 相当于for的固定版本 | for(auto e:s) cout << e <<endl; |
4、string的修改
push_back('t') | 加一个c字符 |
append(str) | 追加 |
operator += | 可以是c格式字符串,还可以是 string 的对象 |
c_str(s1) | 把C++字符串转成c字符串 |
find('y') | 寻找一个字符的位置,成功返回下标 |
insert(pos, "^_^") | 在指定位置插入数据 |
erase(s.find(' ')+1 , 3) | 指定迭代器(iterator)位置也可以是下标位置()sizze_type pos |
substr(pos,8) | 从指定位置截取8个字符,然后返回(返回的是字符串) |
replace(s.begin()+3, 9, s1) | 从迭代器指定位置开始,替换9个字符,用s1,替换 |
swap(str, s1) | 两个字符串交换 |
5、全局的重载的操作符
operator< ,> ,<+... | 可以比大小{c格式字符串比较是比较的地址大小} | 可以是字符串之间比,也可以是C格式字符串和字符串比 |
operator+ | 连接字符串 | 多用+=,这个效率好, +涉及深拷贝 |
operator>> | 输入重载 |
|
operator<< | 输出重载 |
|
getline(cin,s) | 提取一行字符串 | std::getline (std::cin,name);从标准输入宏提取一行字符串 |
operator 【】 | 重载了【】符号 | s1[2] == 'g' |
输入注意:
1、string以空格和回车作为字符串之间的分割
可以想到std::getline()
2、在线OJ输入
注意输入的格式问题
循环接受字符串:
while(cin>>s){
arr[i] = cin
}
vector
和strring一样都是动态顺序表
1、vector类的创建
方法 | 实例 | 解释 |
vector() | std:: vector<int >s1; | 定义一个对象s1 |
vector(size_type, const value_type&val= value_type) | std:: vector<int >s2(18, 9); | 定义一个vector对象中有18个9 |
vector(const vector&x) | std:: vector<int >s3(s2); | 定义一个对象,通过拷贝构造函数拷贝另外一个对象 |
vector(inputiterator,inputiterator) | std:: vector<int >s4(s1.begin(), s2.end()); | 通过迭代器(指针)的方式进行拷贝定义 |
vector{value_type};(列表的初始化) | std::vecotor<int>s5{3, 4, 5, 6, 7, 8, 9} | 直接初始化一个动态顺序表 |
2、vector的容量操作
操作 | 描述 | 实例 |
size | 获取当前容器里数据的个数 | s.size(); |
capacity | 获取当前容器最大容量的值 | s.capacity(); |
empty | 判断当前容器是否为空 | s.empty(); |
resize | 改变容器的size当前有效数据的个数 | s.resize() |
reverse | 改变当前容器的容量大小 |
|
assign() | 重新分配容器的空间 | s.assign(10,'u') | 把s分配成10个'u' |
迭代器失效:由于迭代器本质就是一个指针,指针所指向的空间失效了,对应的迭代器失效了
{只要引起容器底层容量发生变化,这样就会引起迭代器失效}
插入数据时要注意空间是否能发生变化,如果变化,就要刷新迭代器{给迭代器重新赋值}
swap(); push_back();resize();reverse();insert(); erase( ); assign();
用vetor创建一个杨辉三角