2.1 容器string简介
- new a[60]动态数组,关于内存的操作,申请新的内存,使得数组不会超内存。而string不用考虑内存空间,提高开发效率。
- 容器是用来存储的,算法是对数据的一些操作,迭代器是容器和算法的一些关联
- 推荐一本书——侯捷老师《STL源码剖析》,要先会用再研究源码
2.2 string构造函数
- empty()函数,判断类是否为空,空返回true,非空返回false;
- string str;空字符串
- string str(size_type length,char ch);定义一个一定长度的字符串,eg:string str(5 , ‘a’);输出aaaaa
- string str1(“abcde”);输出abcde
- string str(“abcde”,2);输出ab
- string str(str1, 2 , 4);输出cde
- string str(str1); ;输出abcde
2.3 string基础属性
- string的容量,面试通常问及这一类的问题,而不会问函数的用法。容量指的是string、vector等等容器的对象能够包含多少个字符,不同的容器容量不一样。
- capacity()是用来测string的容量,初始化是15,若超过15个字符串,自动增加16个容量至31,以此类推。PS:vc++6.0是申请31个空间,每次增加32个空间,vs申请15个。
- reserve()是用来增加string得容量,不能变小,只能变大。
- length()测字符串长度,size()测字符个数,resize()重新改变字符个数,容量不变,除非超过了原来容量。
2.4 string输出属性
- c_str,是类里面char* p指向类的一个指针,输出的值与str一样
- str可以像数组一样使用下标,str[0] str[1],at()与下标一样用法.at(0) at(1),两个都不能越界。
- try
{
str2.at(8);
}
catch (...)
{
cout << "yuejie" << endl;
}
是一种尝试操作,尝试是否越界,但是不能用于str[]下标,下标是崩溃,at是异常。
2.5 string修改属性
2.6 string比较、复制函数
- 若vs有个报错的提示,警告为C4996,可以用预处理将警报消除,#pragma wanrning(dissable:4996)
2.7 string的迭代器
- String的迭代器是iterator,写法string::iterator,其他容器如vector写法一致。
- Begin函数,返回一个迭代器,指向第一个元素,end函数相反
用法: str.append(str1.begin(), str1.begin() +2);
str.erase(str.begin()+2, str.begin() + 5);
2.8 string的迭代器
- 算法前记得添加头文件#include <algorithm>
- For_each遍历函数,写法为:for_each(str.begin(), str.end(), fun);其中void fun(char c),函数里的值需要为char类型的。
- Sort排序函数,自动给string字符串排序,写法为:sort(str.begin(), str.end());估计是按照ASCII码大小排序,从小到大排序。
- 若sotr从大到小排序,需要加入greater函数,写法为:sort(str.begin(), str.end(),greater<char>());因为string出来的是字符串,所以用char类型。
PS:使用greater,需要加入头文件:#include <functional>
笔记代码如下所示:
#include <iostream>
#include <string>
#include <algorithm>//算法头文件,for_each
#include <functional>//greater头文件
//#define _SCL_SECURE_NO_WARNINGS
using namespace std;
void strdefine();//定义 2.2
void strproperty();//属性 2.3
void stroutput();//输出 2.4
void strchange();//修改 2.5
void strfunction();//操作函数,比较与复制 2.6
void Funiterator();//迭代器 2.7
void testiterator();//测试迭代器 2.7
void Func_suanfa();//算法 2.8
int main()
{
//strdefine();
//cout << "-----------------------------" << endl;
//strproperty();
//cout << "-----------------------------" << endl;
//strchange();
//cout << "-----------------------------" << endl;
//strfunction();
//cout << "-----------------------------" << endl;
//Funiterator();
//cout << "-----------------------------" << endl;
//testiterator();
//cout << "-----------------------------" << endl;
Func_suanfa();
system("pause");
return 0;
}
void strdefine()
{
cout << "以下是string的定义" << endl;
string str;
cout << str << "\t" << str.empty() << endl;
string str1(5, 'a');
cout << str1 << "\t" << str1.empty() << endl;
string str2("abc de");
cout << str2 << "字符串个数" << str2.size() << "字符串长度" << str2.length() << endl;
string str3("abcde", 2);
cout << str3 << endl;
string str4(str2, 2, 4);
cout << str4 << endl;
}
void strproperty()//属性
{
cout << "以下是string的属性" << endl;
string str;
cout << "str的容量" << str.capacity() << "str的长度" << str.length() << endl;
string str1(15, 'a');
cout << "str1的容量" << str1.capacity() << endl;
str1.reserve(31);
cout << "str1变化后的容量" << str1.capacity() << endl;
str1.resize(10);
cout << str1.length() << endl;
cout << str1.size() << endl;
cout << str1.capacity() << endl;
string str2("abcdefg");
cout << "str2的容量" << str2.capacity() << " str2的长度" << str2.length() << endl;
str2.resize(3);
cout << str2 << endl;
string str3("abcde", 2);
string str4(str2, 2, 4);
}
void stroutput()
{
string str2("abcdefg");
cout << str2 << endl;
cout << str2.c_str() << endl;
cout << str2[0] << str2[1] << endl;
cout << str2.at(0) << str2.at(1) << endl;
try
{
str2.at(8);
}
catch (...)
{
cout << "yuejie" << endl;
}
}
void strchange()//修改与插入
{
string str2("abcdefg");
//更改
str2[2] = 's';
cout << " 1 " <<str2 << endl;
str2.at(2) = 'a';
cout << " 2 " << str2 << endl;
string str0(5 , '0');
//插入
str2.insert(2,str0); //将str0在str2的第二位插入
cout << " 3 " << str2 << endl;
str2.insert(2, "wwwwww");
cout << " 4 " << str2 << endl;
str2.insert(2, str0, 0, 2);//从str0的第零位数,两个数,插入
cout << " 5 " << str2 << endl;
str2.insert(2,3,'1');//插入3个1
cout << " 6 " << str2 << endl;
//若不用尾部插入的函数,可以将插入位置设置为str2.length(),即是尾部位置
cout << "-----------------------------" << endl;
//尾部插入
string str11("abcdefg");
string str22(5,'w');
str11 += str22;
cout << " 1 " << str11 << endl;
str11 += "00000";
cout << " 2 " << str11 << endl;
//插入函数
str11.append("ooo");
cout << " 3 " << str11 << endl;
str11.append("+++", 2);
cout << " 4 " << str11 << endl;
//重载预算符
str11 = '0';
cout << " 5 " << str11 << endl;
str11 = str22;
cout << " 6 " << str11 << endl;
//cin >> str11;
//cout << " 7 " << str11 << endl;
str11.assign("asdfghjk");//用法与定义一样
cout << " 8 " << str11 << endl;
//删除
str11.erase(2,2);//从2位置删除两个
cout << " 9 " << str11 << endl;
str11.erase();//delete all
cout << " 10 " << str11 << endl;
}
void strfunction() // 操作函数,比较与复制
{
string str1("aabref");
string str2("abr");
//比较
cout << (str1 < str2) << endl; //结果是真和假,1和0
cout << str1.compare(str2) << endl;//compare是大于的,1和-1
cout << str1.compare("asdc") << endl;
cout << str1.compare(0, 1,"asde", 0, 1) << endl; //前面的是str1 0到1位,后面的是“asde”的
//复制,不是直接复制字符串的值
char arrstr[6] = { 0 };
str1.copy(arrstr , 1 ,1);
cout << arrstr << endl;
//查找子串
cout << str1.find(str2, 1) << endl; //从str1里面寻找str2,若str1包含str2,则返回1,不然返回乱码
//后面的参数指的是,从str1的第几位开始查找
cout << (int)str1.find(str2, 2) << endl; //返回-1,乱码是-1的补码
cout << (int)str1.find("ab", 0) << endl;
//返回子串
str1.substr(2, 4);
cout << "00000"<<str1 << endl;
str1.swap(str2);//交换
cout << str1 << endl;
cout << (str1 + str2) << endl;
cout << (str1 + "haha") << endl;
}
void Funiterator()//迭代器
{
string str("abcdefg");
string::iterator ite;//string迭代器变量名,ite相当于char*字符指针,指向单个元素地址
//char* a = (char*)str.c_str();
//cout << a << endl;
ite = str.begin();//begin返回字符串首地址
str[2] = 'w';
for(int i = 0;i < str.size();i++)//第一行
{
//cout << *ite << " ";
//ite++;//第一种方法
cout << ite[i] << " ";//第二种方法
}
cout << endl;
for (ite; ite != str.end(); ite++)//第二行
{
*ite = 'a';
cout << *ite << " ";
}
cout << endl;
cout << str << endl;
//str.reserve(30);//改容量,ite崩溃,迭代器失效,需要重新指向
//cout << *ite << endl;
str.append(5,'a');//增加字符,使得超过原本容量,ite崩溃
cout << *ite << endl;
}
void testiterator()//测试迭代器
{
string str("abcefghij");
string str1("efg");
str.append(str1.begin(), str1.begin() +2);
cout << str << endl;
str.erase(str.begin()+2, str.begin() + 5);
cout << str << endl;
str.insert(str.begin() + 2, 3, '0');
cout << str << endl;
str.insert(str.begin(), str1.begin(),str1.end());
cout << str << endl;
}
void fun(char c)
{
//c = '0';
cout << c;
}
void Func_suanfa()//遍历算法 排序算法
{
string str("gjajf1Ajl2kka4f");
cout << "原字符串 :";
for_each(str.begin(), str.end(), fun);//遍历函数
//cout << endl;
sort(str.begin(), str.end());//排序函数,自动给字符串排序,估计是按照ACII码大小来排序
cout << endl;
cout << "从小到大排序字符串:";
for_each(str.begin(), str.end(), fun);
cout << endl;
sort(str.begin(), str.end(), greater<char>());
cout << "从大到小字排序符串:";
for_each(str.begin(), str.end(), fun);
cout << endl;
}